2017-06-17 5 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'でそのメソッドを検索します。 "暗黙的なレシーバは 'MainObject'ではなく' self'です。(それが何であれ) –

+0

@JörgWMittag トップレベルのコンテキストで、どのクラスの外にも 'self'とは何ですか?それは 'main'オブジェクトです。irbでチェックしてください。 –

関連する問題