2014-02-01 3 views
3

Я хотел бы создать методы, называемые «добавить» и «вычесть» с помощью параметра пейнтбольного, как показано ниже:Передача параметра пейнтбольного от одного метода к другому методу

def add(*numbers) 
    numbers.inject(0) { |sum, n| sum + n } 
end 

def subtract(*numbers) 
    numbers[0] - add(numbers[1..-1]) 
end 

Но это не сработало. Что мне делать, чтобы передать параметр splat из одного в другой? (Специально для определенного диапазона ...)

Спасибо!

ответ

5

Когда вы вызываете функцию add, добавьте * перед массивом, чтобы распаковать массив в виде нескольких аргументов.

def add(*numbers) 
    numbers.inject(0) { |sum, n| sum + n } 
end 

def subtract(*numbers) 
    numbers[0] - add(*numbers[1..-1]) 
    #    ^
end 

subtract(9, 0, 1, 2) # => 6 
subtract(9, 1) # => 8 
+1

Для того, чтобы 'add' функции принимают только ARG:' [* номера] .inject (0) ... '. BTW, '[* var]' - хороший рубиновый трюк, который не заботится о том, является ли 'var' массивом или нет. В противном случае ваше решение будет зависеть от массива с двумя элеменями ('subtract (9,1)'.) – mudasobwa

+0

@mudasobwa, Спасибо за комментарий. Но я не понимаю, что вы имеете в виду. 'substrct (9, 1)' возвращает '8', как ожидалось. – falsetru

+0

О, извините, по моей вине, я неправильно прочитал splat в 'subtract'. – mudasobwa

0

В качестве альтернативы вы можете принимать числа в функцию добавления в виде массива.

def add(numbers) 
    numbers.inject(0) { |sum, n| sum + n } 
end 

def subtract(*numbers) 
    numbers[0] - add(numbers[1..-1]) 
end 

Более компактный способ сделать это (кстати) будет

def subtract(*numbers) 
    numbers.shift - numbers.inject(:+) 
end 
0
def add *numbers 
    [*numbers].flatten.inject 0, :+ 
end 

def subtract *numbers 
    numbers.shift - add(numbers) 
end 

subtract(9, 0, 1, 2) # ⇒ 6 
subtract(9, 1)  # ⇒ 8