Отправка элементов массива в качестве аргументов для вызова метода - PullRequest
11 голосов
/ 29 декабря 2010

У меня есть метод, который принимает оператор splat:

def hello(foo, *bar)   
   #... do some stuff 
end

У меня есть массив с переменной длиной, который я хотел бы отправить в этот привет-метод:

arr1 = ['baz', 'stuff']
arr2 = ['ding', 'dong', 'dang']

Я бы хотел вызвать метод с arr1 и arr2 в качестве аргументов этого метода, но я продолжаю зацикливаться на этом * bar интерпретируется как массив вместо отдельных аргументов.Чтобы было веселее, я вообще не могу изменить метод hello.

Я ищу что-то похожее на этот вопрос , но в рубине.

Ответы [ 2 ]

12 голосов
/ 29 декабря 2010

попробуйте назвать это так

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

добавляя * ко второму массиву, он обрабатывает их как массив вместо массива , что, как я думаю, вы ищете

8 голосов
/ 29 декабря 2010

Вот, пожалуйста:

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"]

Последнему параметру метода может предшествовать звездочка (*), это указывает на то, что в функцию может быть передано больше параметров. Эти параметры собраны и создан массив.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...