2009-11-25 7 views
6

私はRubyを知らず、今ではいくつかのドキュメントを読んでいます。 コードブロックの使用について読んだ直後に「yield」キーワードを使用することは、複数のコードブロックを関数に渡すことが可能かどうかであり、呼び出された関数内から任意に両方を使用できるかどうかです。Rubyの関数に複数のコードブロックを渡すには?

答えて

9

一度にブロックを1つだけ渡すことができますが、ブロックは実際にはProcのインスタンスであり、パラメータとして必要な数のインスタンスを渡すことができます。

def mymethod(proc1, proc2, &block) 
    proc1.call 
    yield if block_given? 
    proc2.call 
end 

mymethod(Proc.new {}, Proc.new {}) do 
    # ... 
end 

しかし、ほとんど意味がありません。

+1

ブロックは正確にはプロックではありません。彼らは共通の使用法と構文を持っていますが、混乱する動作を引き起こすのに十分な実装上の違いがあります。ちょっとしたことだけど、スコープの違いは私には少し前からある。 – fengb

+0

@fengb私はちょうどテストをしました。 http://gist.github.com/242746 Procとブロックの違いについてもう少し詳しくはありますか? RubyはブロックがProcであると私に伝えています。 –

+0

ブロックは、&var構文を使用してprocに暗黙的に「型キャスト」されます。しかし、ブロックとプロキシとして使用すると、動作が異なる動作があります。 長時間巻きだが包括的な比較: http://innig.net/software/ruby/closures-in-ruby.rb – fengb

1

構文では、yieldステートメントを使用すると、関数に渡されるコードブロックが1つだけサポートされます。

もちろん、複数の他の関数またはコードブロックオブジェクト(Procオブジェクト)を関数に渡して使用することはできますが、単にyieldを使用することではありません。

1

Procオブジェクトを作成し、好きなだけ多くのオブジェクトを渡すことができます。

Rubyが持っているブロックとクロージャのような構造のすべての微妙さを理解するために、this pageを読むことをお勧めします。

1

あなたには渡された2つの別々のブロックを処理するためにcall方法ではなく、歩留まりを使用することができます

をここに方法は次のとおりです。あなたが例えばに引数を渡すことができ

def mood(state, happy, sad) 
    if (state== :happy) 
    happy.call 
    else 
    sad.call 
    end 
end 

mood(:happy, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'}) 
mood(:sad, Proc.new {puts 'yay!'} , Proc.new {puts 'boo!'}) 

happy.call('very much') 

議論はあなたがブロックで期待するように機能します:

Proc.new {|amount| puts "yay #{amount} !"} 
関連する問題