2015-04-09 4 views
0

У нас есть метод:Рубин массив Eval в качестве аргумента метода

def sum(x, y, z) 
x + y + z 
end 

и массив

arr = [1,2,3] 

Как можно передать массив подводить метод? На самом деле мне нужно что-то вроде:

pseudo 
sum(arr.each {|i| i}) 

без метода изменения, и он будет работать, если сумма будет принимать восклицательный знак, поэтому, пожалуйста, не предлагайте сумму (обр [0], обр [1], обр [2])

ответ

6

Вы можете использовать оператор splat * Выполнение этого автоматически присваивает каждому значению в массиве соответствующий именованный параметр.

sum(*arr) 
#=> The above will automagically do 
#=> x = arr[0] 
#=> y = arr[1] 
#=> z = arr[2] 

ArgumentError будут повышены, если прошло больше элементов.

+0

cp, если вы не уверены, вы можете проверить параметры 'sum' с помощью [Параметры метода #] (http://ruby-doc.org/core-2.2.0/Method.html#method- i-parameters): 'method (: sum) .parameters # => [[: req,: x], [: req,: y], [: req,: z]]'. Обратите внимание, что вам сначала нужно преобразовать символ ': sum' в метод с [Object # method] (http://ruby-doc.org/core-2.2.0/Object.html#method-i-method). –

+0

* «остальные значения в' arr' будут проигнорированы, если они присутствуют »* -' ArgumentError' возникает, если количество аргументов не совпадает. – Stefan

+0

@Stefan ах, спасибо. Не знал этого. –

0

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

def sum *numbers 
    numbers.flatten.inject :+ 
end 

он будет принимать:

sum 1,2,3,4 
sum [1,2,3,4] 
sum [1,2,3,4],[3,4],8,9 

*numbers является массивом содержащий все аргументы, переданные методу sum (кроме блока, который метод не принимает). Это то, что делает оператор *.

#inject method - это действительно удобный ярлык для использования в перечислимых объектах.

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