2017-06-17 34 views
1

执行代码时,我得到以下错误:红宝石:传递块作为参数从oustide类

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) 

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

如何通过班级以外的块。请任何帮助。

回答

1

这里是YOUT代码:

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) 

需要定义的λ或proc和它存储在一个变量,或者使用的每一个隐式块。 下面是使用的λ的例子:

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

好了,问题就在这里:

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方法传递一个块。

+0

“在Ruby,如果调用的方法,而无需指定通过'的object.method其对象( '),解释器在'MainObject'中搜索该方法。“ - 不。隐含的接收者是'self',而不是'MainObject'(不管是什么)。 –

+0

@JörgWMittag 什么是顶级上下文中任何类之外的'self'?它是'主要'对象,请在irb中检查它。 –