Ruby:将块作为参数从oustide类传递

Ruby:将块作为参数从oustide类传递,ruby,ruby-block,Ruby,Ruby Block,执行代码时出现以下错误: example.rb:9:in `<main>': undefined method `each' for main:Object (NoMethodError) 我的动机是用目标参数调用block 我怎样才能在课外通过一个街区。请提供帮助。问题出在这里: tp = TargetProvider.new each { puts "Hello!" } # Here tp.each(1, each) 在这里,您调用的是每个方法,而不是声明一个新变量。 在Ru

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

example.rb:9:in `<main>': undefined method `each' for main:Object (NoMethodError)
我的动机是用目标参数调用block


我怎样才能在课外通过一个街区。请提供帮助。

问题出在这里:

tp = TargetProvider.new
each { puts "Hello!" } # Here
tp.each(1, each)
在这里,您调用的是每个方法,而不是声明一个新变量。
在Ruby中,如果调用一个方法而不指定其对象(通过
object.method
),解释器将在
MainObject
中搜索该方法

很明显,其中没有这样的方法,所以这就是错误所在

您可能希望实现以下目标:

tp = TargetProvider.new
tp.each(1) { puts "Hello!" }
该代码调用
TargetProvider
每个
方法,并向其传递一个块。

以下是您的代码:

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并将其存储在变量中,或者使用每个变量的隐式块。 以下是使用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!" }

“在Ruby中,如果调用一个方法而不指定其对象(通过
object.method
),解释器会在
MainObject
中搜索该方法”——不。隐式接收器是
self
,而不是
MainObject
(不管是什么)。@JörgWMittag在顶级上下文中,任何类之外的
self
是什么?右边是
main
对象,请在irb中查看它。
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!" }