将Proc传递给方法的尝试有什么问题?

时间:2011-11-12 17:18:13

标签: ruby-on-rails ruby

我只是潜入Procs,blocks和lambdas。我正在考虑尝试不同的事情,但我不确定为什么这不起作用:

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)

# `iterate': wrong number of arguments (2 for 1) (ArgumentError)

2 个答案:

答案 0 :(得分:3)

那是因为&最后一个方法参数之前的符号用于将块显式定义为参数。

在您的情况下,您有两种方式: 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)使用块而不是proc创建:

def iterate(ary, &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]

答案 1 :(得分:1)

我认为,当你传入一个proc(而不是一个块)时,你不需要方法定义中&参数前面的code