Отправка элементов массива в качестве аргументов вызова метода
У меня есть метод, который принимает оператор splat:
def hello(foo, *bar)
#... do some stuff
end
У меня есть массив с переменной длиной, который я бы хотел отправить в этот метод приветствия:
arr1 = ['baz', 'stuff']
arr2 = ['ding', 'dong', 'dang']
Я хотел бы вызвать метод с arr1 и arr2 в качестве аргументов этого метода, но я продолжаю зависеть от того, что * bar интерпретируется как массив вместо отдельных аргументов. Чтобы сделать вещи более увлекательными, я вообще не могу изменить метод hello.
Я ищу что-то похожее на этот вопрос SO, но в рубине.
Ответы
Ответ 1
попробуйте назвать его так
hello(arr1, *arr2)
здесь пробег в irb
irb(main):002:0> def hello(foo, *bar)
irb(main):003:1> puts foo.inspect
irb(main):004:1> puts bar.inspect
irb(main):005:1> end
=> nil
irb(main):006:0> arr1 = ['baz', 'stuff']
=> ["baz", "stuff"]
irb(main):007:0> arr2 = ['ding', 'dong', 'dang']
=> ["ding", "dong", "dang"]
irb(main):008:0> hello(arr1, arr2)
["baz", "stuff"]
[["ding", "dong", "dang"]]
=> nil
irb(main):009:0> hello(arr1, *arr2)
["baz", "stuff"]
["ding", "dong", "dang"]
=> nil
добавив * ко второму массиву, он рассматривает их как массив, а не массив массива, и это то, что вы ищете, я думаю,
Ответ 2
Здесь вы идете:
hello('Something', *(arr1 + arr2))
Это объединит массивы arr1
и arr2
и вместе передаст их из второго аргумента в метод.
Пример:
>> def hello(str, *args)
>> puts str
>> args.each do |arg|
?> puts 'Splat: ' + arg
>> end
>> end
=> nil
>> hello('Hello', *(['programming'] + ['is', 'fun']))
Hello
Splat: programming
Splat: is
Splat: fun
=> ["programming", "is", "fun"]
Последнему параметру метода может предшествовать звездочка (*
), это означает, что к функции может быть передано больше параметров. Эти параметры собираются и создается массив.
Поскольку последние параметры собраны в массив, вам нужно использовать оператор *
, чтобы указать, что вы действительно отправляете массив методу и что он не должен переносить аргументы в другой массив.