2017-06-17 45 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中檢查它。 –