21

私はプログラミングに不慣れであり、ルビーはそれでの私の最初の実際の実行です。ブロックを取得しますが、procは軽いメソッド/関数の概念のように見えます-なぜそれらを使用するのですか?なぜメソッドを使用しないのですか?

ご協力いただきありがとうございます。

4

2 に答える 2

11

Procは呼び出し可能なコードです。これを変数に格納し、引数として渡すか、それ以外の場合はファーストクラスの値として扱うことができます。

なぜメソッドを使用しないのですか?

ここでの「方法」の意味によって異なります。

class Foo
  def bar
    puts "hello"
  end
end

f = Foo.new

このコードスニペットでは、メソッドの使用barはかなり制限されています。あなたはそれを呼ぶことができます、そしてそれはそれです。ただし、それへの参照を保存したい場合(別の場所に渡して、そこで呼び出すため)、これを行うことができます。

f = Foo.new
bar_method = f.method(:bar)

bar_methodこれはラムダに非常に似ています(これはProcに似ています)。bar_method第一級市民ですが、そうでf.barはありません。

詳細については、@minitechが言及している記事を参照してください。

于 2012-03-18T20:12:35.173 に答える
9

ディスパッチテーブルのデザインパターンの例


メソッドの代わりにprocを使用するのはなぜですか?

  • パラメータに応じて動作が変化する動的に定義することをお勧めします。
  • メソッドのハンドルを取得して、データとして参照できるようにすることができます。

一般的なデザインパターンには、ランタイム値に基づいて呼び出すメソッドまたはコードブロックの選択が含まれます。例えば...

case 1
  when 0
    p :a
  when 1
    p :b
  when 2
    p :c
end

セレクターが多く、ディスパッチメカニズムを段階的にまとめる方法がない場合、これはやや不格好になります。したがって、代わりに次のようなことができます。

h = [ proc { p :a }, proc { p :b }, proc { p :c } ]

h[1].call

キーが小さな整数のシーケンスでない場合は、のHash代わりに使用することもできます。Array不格好なケースセレクターデザインパターンはすべての言語で頻繁に発生しますが、dispatch-table-of-procsが使用されることはめったにありません。通常、結果自体をArrayまたはに保存してからHash、直接インデックスを作成することができます。ただし、複雑な場合は、を呼び出すとproc最も柔軟性が高くなります。

Rubyで進むと、これがRubyにブロックがある理由であることがわかります。ブロックは基本的に、パラメータとして別のメソッドに渡されたメソッドです。これはRubyとSmalltalkで非常に簡単に実行できるため、常に使用されます。Cでも同じことができますが、面倒くさいので、コードライターが複雑さで必死の戦いに負けているときにのみCで見られます。

于 2012-03-18T20:31:19.713 に答える