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!" }