объединить с splat ruby

скажи, что у меня есть

arr = [1,2,3]

Как я могу изменить этот метод, чтобы он добавлял каждый аргумент в массив?

def add(*number)
  arr << *number
end

Итак, add(4,5,6) производит:

arr #=> [1,2,3,4,5,6]

person stevenspiel    schedule 31.12.2013    source источник
comment
в чем причина отрицательного ответа на мой вопрос? Это плохой вопрос?   -  person stevenspiel    schedule 01.01.2014
comment
Похоже, кто-то бегал с целой кучей отрицательных голосов и не понимал, что за каждый потерянный голос он получает один обратно. Я поставлю тебе +1.   -  person the Tin Man    schedule 01.01.2014


Ответы (3)


При приеме аргументов через splat они всегда будут массивом. Таким образом, вы можете просто сложить два массива вместе.

def add(*numbers)
  arr + numbers
end
person Alex Wayne    schedule 31.12.2013
comment
Как arr будет действителен внутри def ? arr не будет распознаваться как локальная переменная для def add. - person Arup Rakshit; 01.01.2014
comment
В какой версии рубина это работает? Я получаю сообщение об ошибке: undefined local variable or method 'arr' for main:Object (NameError) - person Matt; 01.01.2014
comment
Это надуманный пример... Учитывая код примера и поставленную проблему, вот как вы должны изменить этот код для достижения желаемого результата. Объем arr не имеет отношения к этому вопросу. - person Alex Wayne; 01.01.2014
comment
Стоит отметить, что #<< добавляет, а #+ создает новый массив. - person jonahb; 01.01.2014
comment
@jonahb << добавляет отдельные элементы. Используйте arr += [4,5,6] для добавления всего массива. - person Matt; 01.01.2014

Используйте 1_:

def add(*nums)
  arr.concat nums
end

Or +:

def add(*nums)
  arr + nums
end
person Denis de Bernardy    schedule 31.12.2013

$arr = [1,2,3]

def add(*number)
  $arr.concat number
end

add(4,5,6)

$arr #=> [1,2,3,4,5,6]

Примечание: concat изменяет объект, над которым он работает ($arr). Плюс (+) нет.

Как упоминает Железный человек, вы не хотите использовать глобальный для этого. Лучше просто сделать

arr.concat [4,5,6]

вне вызова функции. Еще лучше:

arr += [4,5,6]
person Matt    schedule 31.12.2013
comment
Нет нет нет. Не используйте глобальную переменную для решения простой проблемы с областью видимости. - person the Tin Man; 01.01.2014
comment
@theTinMan И вопрос, и принятый ответ попытка использовать глобальное значение, но терпят неудачу, поскольку в нем отсутствует символ глобального префикса $. Это, по крайней мере, показывает, как сделать это правильно так, как этого хочет OP. В любом случае ответ обновлен, чтобы ответить на ваш комментарий. - person Matt; 01.01.2014
comment
Отвечая на вопросы, мы сталкиваемся с множеством очень плохих примеров программирования. Мы не очень хорошо служим человеку, когда имитируем его плохой код в своем ответе; Вместо этого мы только увековечиваем их недостаток знаний. Вместо этого мы должны ответить на их вопрос И показать правильный способ сделать это. Это похоже на идею дать им рыбу вместо того, чтобы научить их ловить рыбу. Покажите им, как сделать это правильно, чтобы предотвратить будущие проблемы в других областях. - person the Tin Man; 01.01.2014