3

私はここ数週間でRubyオブジェクトモデルを理解することに没頭しました。これまでのところ、これまではrubyとpythonのオブジェクトの成果を使用しただけでしたが、他の言語ではこれらがどのように異なるのか興味がありました。

数年前、私はsmalltalkのきしむ音に触れました。Smalltalkはしばしば参照オブジェクト指向言語として考えられているので、私はそれに興味を持っています。ルビーオブジェクトモデルはオブジェクトとクラスを区別しません。存在するシングルトンオブジェクトは、必要に応じてすべてのオブジェクトをプロトタイプ拡張可能にします。私が知っているように、メタオブジェクトプロトコルとして定義されているこれらすべてのこと。これらのことは、C++やJavaのような他のあまり動的ではない言語が可能にするものよりも生活を楽にします。

メタオブジェクトプロトコルの実現において、動的言語、特にsmalltalk、python、rubyがどのように異なるかを教えてください。

4

2 に答える 2

2

私が覚えているPythonとSmalltalkの主な違いは、属性のプライバシーの処理方法です。Smalltalkでは、属性を定義し、すべてのアクセサーを即座に生成して(幸い、Dolphin Smalltalkがこれを実行しました)、それらを使用する必要がありました。一方、Pythonでは、プライベートと見なされる属性(最初に__が付いていて、___を形成するようにマングルされている属性)も含めて、すべてにアクセスできます。これは潜在的に危険であると言う人もいるかもしれません。たとえば、将来のある時点で、特定の属性を変更するときに、いくつかの操作を実行する必要があります。しかし、Pythonはプロパティを使用してそれを適切に解決します

好きなものにアクセスできるという考え方が好きです。私が何をしているのかを知っているだけなら、私はそれを行うことができます:-)

于 2010-01-13T14:31:24.527 に答える
2

Pythonでは、各オブジェクトに1つの名前空間があります。その名前空間でアクセス可能なオブジェクトの「属性」は、メソッド、他のオブジェクトへの単純な参照(呼び出し可能かどうか)、または記述子によってオンザフライで合成できます(プレーン属性はインスタンスまたはクラス内ですが、記述子(メソッドを合成する記述子としての関数を含む)は、インスタンスではなくクラスに存在する場合にのみ使用されます。したがって、特に「特別なメソッド」は、クラスで定義されている場合にのみ特別です。インスタンスではありません)。属性処理ビルトインと特別なメソッド(、、、、、 ...)はgetattr、 「プレーン属性」を参照しているかどうかに関係なく、オブジェクトの単一の名前空間全体でまったく同じように機能します。setattr__getattr____setattr__

重要な点はa、Pythonの任意のオブジェクトはa.b、メソッド(または他の呼び出し可能)であるかどうかです。Pythonコンパイラは、参照を取得してa.b(たとえば)引数として渡すことができます(気にしない)。 、結果として返し、リストに追加するなど、これらの操作はいずれも。を呼び出す a.bことを意味しません。を(試して)呼び出したい場合a.bは、かっこを後置して明示的a.b()に呼び出します。引数なしで呼び出したい場合。

Rubyでは、オブジェクトのメソッドと属性は別々の名前空間に存在し(したがって、Pythonではできない、同じ名前のメソッドと属性を持つオブジェクトを持つことができます)、引数のないメソッドを暗黙的に「言及」します。それを呼び出します(したがってc=a.b、属性参照を取得している場合もa.b()あれば、呼び出している場合もあります。bでメソッドと属性の両方に名前を付ける場合a、使用を明確にするためにどのヒューリスティックルールが使用されているか思い出せません)。したがって、メソッド参照を取得し(たとえば、コンテナに格納したり、引数または戻り値として使用したりする場合)、後で呼び出しを実行する場合は、別の構文を使用します。

SmalltalkにもRubyのように個別の名前空間がありますが、特定のオブジェクトの「非メソッド」属性を参照することはできません(各オブジェクトはそれ自体の属性を「見る」だけです)ので、このあいまいさは発生しません(ただし、まだあります)特定のメッセージを使用して抽出し、後で「メソッド参照」を呼び出すため)。

于 2010-01-13T16:06:35.177 に答える