#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
Я просто погружаюсь в процедуры, блоки и лямбды. Я пытаюсь использовать разные вещи, но я не уверен, почему это не работает:
def iterate(ary, amp;code)
ary.each_with_index do |n, i|
ary[i] = code.call(n)
end
end
iterator = Proc.new do |n|
n ** 2
end
p iterate([1,2,3], iterator)
# `iterate': wrong number of arguments (2 for 1) (ArgumentError)
Ответ №1:
Это потому, что символ amp; перед параметрами последнего метода предназначен для явного определения блока в качестве параметра.
В вашем случае у вас есть 2 способа: 1) Использовать параметр proc вместо block:
def iterate(ary, code)
ary.each_with_index do |n, i|
ary[i] = code.call(n)
end
end
iterator = Proc.new do |n|
n ** 2
end
p iterate([1,2,3], iterator) # => [1, 4, 9]
или 2) Использовать block вместо создания процедуры:
def iterate(ary, amp;code)
ary.each_with_index do |n, i|
ary[i] = code.call(n)
end
end
p iterate([1,2,3]) { |n| n ** 2 } # => [1, 4, 9]
Ответ №2:
Я думаю, что поскольку вы передаете процедуру (а не блок), вам не нужен параметр amp;
перед code
в определении метода.