2009-08-07 18 views
21

は、私は私のように奇妙打つRubyの方法、手順、およびブロックに関するカップルの質問があります。意思決定の背後にある論理と同じように、構文や機能についてのものではありません。Rubyのメソッド、PROC、およびブロック混乱

質問1:

なぜブロックは方法(例えば、各々)に渡すことができるが、それらは、変数に割り当てることができないことですか!

プロシージャでそれらを渡すことができます(つまり、&pでアクセスされる)p = Proc.new {...}ですが、プログラマがこれらの手段を通過するようには意味がありません。

質問2:

なぜ方法及び手順の区別がありますか?

def square(x) 
    x**2 
end 

square(3) 
=> 9 

または

square = lambda {|x| x**2} 
square.call(3) 
=> 9 

なぜ分化:

は例えば、私は、次の2つの方法でその機能を関数を定義し、呼び出しのタスクを達成することができますか?例えばPythonでは、標準的な方法で関数を定義することとsquare = lambda x: x**2によって関数を作成し、それをsquareに割り当てるという同じタスクを達成します。

答えて

20

質問1:ブロックはオブジェクトではありません、彼らは統語構造です。これが変数に代入することができない理由です。これはオブジェクト用に予約された特権です。

質問2:メソッドはオブジェクトではありませんので、彼らはメッセージを受信できません。逆に、procsとlambdaはオブジェクトなので、メソッドのように呼び出すことはできませんが、メッセージとともに渡されたパラメータに基づいて値を返すようにメッセージを受け取る必要があります。

手続きオブジェクトとラムダはオブジェクトであるので、彼らはcallメッセージを受け取ることができますし、名前に割り当てられます。要約すると、procsとlambdaを奇妙な方法で振る舞うようにするのはオブジェクトです。メソッドとブロックはオブジェクトではなく、その動作を共有しません。

+5

Rubyはすべてのものがオブジェクトであると主張しています。ブロックはそれに合わせるためにオブジェクトでなければならず、引数として渡すことができるため、いくつかの点でオブジェクトのように確実に動作します。 – rpjohnst

+6

ブロックは、それらを表現するオブジェクト、すなわちprocまたはlambdaを作成することによって、オブジェクトのように動作するようにすることができます。そのデバイスがなければ、それらは構文的な構造にすぎません。 – Pinochle

+0

ブロックオブジェクトがあります - それはlambda {何でも}の目的です。 – Chuck

4

メソッドはメソッドです - つまり、彼らは、オブジェクトがメッセージに応じて実行できるアクションです。それらは機能ではありません。

ブロックが閉鎖されている - 彼らが囲む範囲を超える閉じる機能です。概念的には、与えられたオブジェクトに「属し」ません。

いくつかの言語では、メソッドは単にオブジェクトのメンバーである関数ですが、Rubyではこれを表示しません。メソッドの所有オブジェクトからの分離は、単純な割り当てよりも手術に似ています。 Rubyは、オブジェクト指向モデルを近代OOの祖父であるSmalltalkから取ります。ある程度まで

5

は、少なくとも、方法オブジェクトである:文書hereの方法:それをさらに

class ABC 
    def some_method 
    end 
end 
ABC.instance_method(:some_method) #=> #<UnboundMethod: ABC#some_method> 

、ビルトインクラスがあります。

もこの参照:http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls

無計画<bseg>、むしろすべてが-ある-オブジェクトを事を裏付けているように見えるん。この特定のケースでは、ちょっとだけ掘り起こすように見えます。

(私は本当にこのことをよく理解するために努力をする必要があります。私はそれがより深い理解を得るために基本的なことだと思うし始めている)

+0

メソッドは、そのオブジェクト性を 'Proc'のインスタンスとしてとらえているようです。 'method'の' ri'文書では、 'method 'という言葉は説明には使われませんが、' proc'は 'proc 'です。 2つのクラスは同じメッセージを受け取りますが、違いはそれらがどのように呼び出され、どのメソッドが別のオブジェクトの名前空間内で定義されているかです。ここでprocsは呼び出される 'call'メソッドを受け取る必要があります。私は前に言った)他のオブジェクトから独立しています。 – Pinochle

+0

ああ、別の違いは... 'メソッド'は 'proc'が行う' new'メッセージを受け取りません。メソッドがオブジェクトである場合、それらは完全な意味でのオブジェクトではありません(オブジェクトに見られるすべての特性を持つ完全な意味)。 – Pinochle

+0

ウィキブックスのリンクが参考になります。ありがとう。 – David

関連する問題