2017-07-26 16 views
2

私は、それと一緒に渡されたブロック内のオブジェクトのパラメータの1つを参照しようとしています。渡されたブロック内のオブジェクトのパラメータを参照するにはどうすればよいですか?

def command(attributes = {}, &block) 
    yield 
end 

command(attr_1: 'Open Mike Night', 
    attr_2: 2033392, 
    attr_3: [9.29, 10.08, 12.32]) do |event| 

    event.message.delete 

    puts "#{self.attributes[:attr_1]}" # <-- That didn't work. 

end 

可能な場合はどうすればできますか?私は何を調べるべきですか?

+0

最後のキーは 'attr_3'ですか? –

+0

@ sagarpandya82よろしいですか、ごめんなさい! – Calculon

+0

あなたの 'command'定義に' yield'がありますか? –

答えて

0

私の頭の上からあなたはこのようなことをすることができます。これが生産コードに適しているかどうかはわかりません。

このコードは、引数ハッシュのキーを反復処理することによって、各キーのインスタンス変数を作成します。

def command(attributes = {}, &block) 
    attributes.each_key { |key| 
    instance_variable_set("@#{key}",attributes[key]) 
    } 
    yield 
end 

command(attr_1: 'Open Mike Night', 
     attr_2: 2033392, 
     attr_3: [9.29, 10.08, 12.32]) do |event| 

    puts "#{@attr_1}" 
end 

プリント:

Open Mike Night 
+0

メソッドが呼び出された場所とは異なるスコープでメソッドが定義されている場合、これは機能しません。ブロックはその周囲でスコープされているので、 'class A 'に' command'が定義されていて、 'class B'でメソッドが呼び出された場合、' @ attr_1'は 'A'ではなく' B'のコンテキストで評価されます –

0

は、ブロックにそれらを収率)

def command(attributes = {}) 
    yield self, attributes 
end 

attributes = { attr_1: 'Open Mike Night', attr_2: 2033392, attr_3: [9.29, 10.08, 12.32] } 

command(attributes) do |obj, attrs| 
    p "#{obj.object_id}, #{attrs[:attr_1]}" 
end 
# => "70309890142840, Open Mike Night" 

我々はcommandを呼び出すときに、我々は、対応するinstance_variableを使用してブロック内の各キーの値を参照することができますメソッドスコープ内で使用可能なメソッド、定数、または変数は、ブロック変数としてブロックに送信されるyieldの引数として指定できます。それから、あなたが望むものは何でもできます。この場合、attrsは完全にオプションの変数でもあり、ブロックはそれがなくても有効です。

command(attributes) { |obj| p obj.object_id } # => 70309890142840 

P.S. yieldを使用している場合は、メソッドシグネチャに&blockは必要ありません。また、あなたの質問にyield引数を与えていなかったが、|event|変数をブロックに渡していました(nil)。だから私は上記の例でそれを残しました。

関連する問題