1

Ruby 2.0 から始めたときに、新しいキーワード パラメータで動作する小さなスクリプトを作成しました。これをコーディングしているときに、ブロックとラムダの動作に驚きました。以下は私が見つけたものを練習します:

def print_parameters(proc = nil, &block)
  p "Block: #{block.parameters}" if proc.nil?
  p "Lambda: #{proc.parameters}" unless proc.nil?
end

print_parameters(-> (first, second = 'test') {})
print_parameters(&-> (first, second = 'test') {})
print_parameters {|first, second = 'test'|}

結果は次のとおりです。

"Lambda: [[:req, :first], [:opt, :second]]"
"Block: [[:req, :first], [:opt, :second]]"
"Block: [[:opt, :first], [:opt, :second]]"

ブロックの作成に必要なパラメーターがないのに、ラムダまたはラムダから作成されたブロックを使用するのはなぜですか?

4

2 に答える 2

2

Integer#timesRuby のブロックのセマンティクスは、やなどのイテレータにとって可能な限り有用になるように設計されていますEnumerable#each。ブロックには必須パラメーターがないため、次のようなことができます。

10.times { puts "Hello!" }

...また:

10.times { |i| puts i }

これは、Rubyのnext/の区別の背後にある理由でもあります。return

Ruby の「ラムダ」は異なります。それらは「ループ本体」として使用するために「最適化」されていません (ただし、必要に応じてそのように使用できます)。渡される引数の数がより厳密になっているため、バグの発見に役立つ可能性があります。

于 2013-04-21T21:22:07.660 に答える
0

lambdasruby のメソッドのように動作します。メソッドを定義するとき、パラメーターが必要な場合は、そのメソッドを呼び出すときにパラメーターを指定する必要があります。ブロックは次のように動作しprocsますprocs。パラメータを宣言できますが、必要ありません。

lambda構文は実際にはproc厳格なアリティで作成します。両方の変数のクラスを出力する場所を指定すると、ラムダとブロックの両方が のインスタンスであることがわかりますProcprocラムダ構文を使用して作成された は、#lambda?メソッドに true を返します。また、この SO ディスカッションをチェックして、ラムダとプロシージャの間の他の動作の違いを理解してください。いつラムダを使うべきか、いつ Proc.new を使うべきか?

于 2013-04-21T21:32:06.997 に答える