Что не так с этой попыткой передать Proc в метод?

#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 в определении метода.