2013-07-07 6 views
1

Я хочу, чтобы это сделать:Рубин знак и << операторы

a << *b 

, но это происходит в IRB:

1.9.3p327 :020 > a 
=> [1, 2, 3, 4] 
1.9.3p327 :021 > b 
=> [5, 6, 7] 
1.9.3p327 :022 > a << *b 
SyntaxError: (irb):22: syntax error, unexpected tSTAR 
a << *b 
    ^

ли я что-то отсутствует?

+0

Не будет ли 'a + b' более интуитивным для этого варианта использования? – scones

+2

вы можете сделать это + = b –

ответ

3

Посмотрите причину здесь:

a = [1, 2, 3, 4] 
b = [5, 6, 7] 
p a.<<(*b) 
# ~> -:3:in `<<': wrong number of arguments (3 for 1) (ArgumentError) 
# ~> from -:3:in `<main>' 

<< метод ожидает только один argument.So теперь, как ниже знак (*) является оператором, который будет создавать 5,6,7, которые << метод не следует ожидать, а она ожидает только один объект. Таким образом, дизайн Ruby не позволяет * до b.

a = [1, 2, 3, 4] 
b = [5, 6, 7] 
p a << * 
# ~> -:3: syntax error, unexpected * 

a = [1, 2, 3, 4] 
b = [5, 6, 7] 
p a << *b 
# ~> -:3: syntax error, unexpected * 
# ~> p a << *b 
# ~>  ^

Вот почему 2 законные ошибки:

  • неверное число аргументов (3 для 1) (ArgumentError)

  • синтаксическая ошибка, неожиданные *

Возможно, вы можете использовать -

a = [1, 2, 3, 4] 
b = [5, 6, 7] 
p a.push(*b) 
# >> [1, 2, 3, 4, 5, 6, 7] 
+0

+1 для объяснения :) –

1

Проверьте тип подписи: ary < < obj → ary. Он ожидает ровно один параметр. Попробуйте: a.push (* б) (толчок (объект, ...) → ичных)

4

Попробуйте это:

a.concat(b) 

будет выход:

=> [1, 2, 3, 4, 5, 6, 7] 
5

я прокомментировал его eariler и теперь добавив его в ответ ;-)

а + = Ь будет делать свою работу

+1

* + 1 * вам ..также;) –

+1

Мне нравится этот ответ, в отличие от тех, кто пытается объяснить, как использовать символ '*' по этой причине: подумайте о том, как другие люди будут реагировать, глядя на этот код. Вы делаете это очевидным, что вы делаете, или неправильно направляете их? Важная вещь, которую следует помнить о Ruby, состоит в том, что даже при том, что у нее есть некоторые удивительные ярлыки, простота является единственной самой большой характеристикой хорошего кода. –

+1

Согласен. Но мне также нужно понять, почему все работает, а почему нет. –

1

Учитывая

a = [1, 2, 3, 4] 
b = [5, 6, 7] 

Решение вы хотите

a.concat b 
# => [1, 2, 3, 4, 5, 6, 7] 

Однако, вы могли бы найти это немного интересно

b.each &a.method(:<<) 
a 
# => [1, 2, 3, 4, 5, 6, 7] 

Это говорит "вызов метода a#<< по каждому элементу в б"

Эквивалент

b.each &a.method(:push) 
a 
# => [1, 2, 3, 4, 5, 6, 7] 
+0

whoah? | прохладно, но не так читаемо. –

+0

@MichaelKMadison, я добавил для вас более «читаемую» версию ... – naomik

Смежные вопросы