私はプログラミングに不慣れであり、ルビーはそれでの私の最初の実際の実行です。ブロックを取得しますが、procは軽いメソッド/関数の概念のように見えます-なぜそれらを使用するのですか?なぜメソッドを使用しないのですか?
ご協力いただきありがとうございます。
私はプログラミングに不慣れであり、ルビーはそれでの私の最初の実際の実行です。ブロックを取得しますが、procは軽いメソッド/関数の概念のように見えます-なぜそれらを使用するのですか?なぜメソッドを使用しないのですか?
ご協力いただきありがとうございます。
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が言及している記事を参照してください。
メソッドの代わりに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で見られます。