Ruby: 从外部将块作为参数传递 class

Ruby: passing blocks as parameters from oustide class

我在执行代码时出现以下错误:

example.rb:9:in `<main>': undefined method `each' for main:Object (NoMethodError)

第 9 行是我代码中的倒数第二行。

我的代码:

class TargetProvider
  def each(target,&block)
    block.call(target)
  end   
end

tp = TargetProvider.new
each { puts "Hello!" }
tp.each(1, each)

我的动机是用目标参数调用块。

我怎样才能在 class 之外通过一个街区。请帮忙。

嗯,问题来了:

tp = TargetProvider.new
each { puts "Hello!" } # Here
tp.each(1, each)

在这里,您正在调用 each 方法,而不是声明新变量。 在 Ruby 中,如果您调用一个方法而不指定其对象(通过 object.method),解释器会在 MainObject 中搜索该方法。

很明显里面没有这个方法,所以才报错

你可能想要实现的是这样的:

tp = TargetProvider.new
tp.each(1) { puts "Hello!" }

该代码调用 TargetProvidereach 方法并向其传递一个块。

这是你的代码:

class TargetProvider
  def each(target,&block)
    block.call(target)
  end   
end

tp = TargetProvider.new
each { puts "Hello!" } # this line is trying to run a method called each
tp.each(1, each)

您需要定义一个lambda 或proc 并将其存储在一个变量中,或者使用each 的隐式块。 这是一个使用 lambda 的示例:

class TargetProvider
  def each(target,&block)
    block.call(target)
  end   
end

tp = TargetProvider.new
each_block = lambda { |a| puts "Hello!" }
tp.each(1, &each_block)

下面是一个使用隐式块的例子:

class TargetProvider
  def each(target,&block)
    block.call(target)
  end   
end

tp = TargetProvider.new
each_block = lambda { |a| puts "Hello!" }
tp.each(1) { puts "Hello!" }