2012-02-25 7 views
5

私はhas_manyと同様の構造の内部の仕組みを理解したいと思っているので、私はレールのソースコードを分析しています。ruby​​ on railはどのように実装されていますか?

これまでのところ、私は(link to github)メソッドが実装されている場所を見つけることができた。それはモジュールのActiveRecordである::協会

def has_many(name, options = {}, &extension) 
    Builder::HasMany.build(self, name, options, &extension) 
end 

この1つはeventualyクラスのActiveRecordで(link to githubを)終了::私のルビーのスキル端と、私はさらにそれを追跡し、「新しい」が実装され、どのようなそれがないているところを見つけることができませんでしたどこ協会::ビルダー:: CollectionAssociation

def self.build(model, name, options, &extension) 
    new(model, name, options, &extension).build 
end 

などがあります。

誰かが正しい方向に向いていて、それに沿ってコメントすることはできますか。何が起こっているのですか?

+4

+1ツールのソースコードを熟読するためにあなたが得るために使用している:

class Class def new(*args, &block) obj = allocate obj.initialize(*args, &block) # *actually* obj.send(:initialize, *args, &block) since initialize is private obj end end 

allocateは次のように定義されています内部のより深い理解。行く道。 –

+1

@ s.m .:同意します。ソースコードを読んでも「研究努力を示していない」(upvoteボタンのツールチップに記載されているように)、何か分かりません! +1! –

+1

お返事ありがとうございます。私はJörgの答えを受け入れました。私はまた、Baldrikとs.m.を+1します。答えた最初の人であるためです。 –

答えて

4

基本的には、newは次のように定義されています。

class Class 
    def allocate 
    # magic stuff for creating an empty object which cannot be expressed in Ruby: 

    new_obj = Deep::Within::VM.__somehow_magically_allocate_memory__! 

    new_obj.__class__ = self 

    new_obj 
    end 
end 
1

newは、現在のクラスのコンストラクタを呼び出します。コンストラクタは、CollectionAssociationself.buildメソッドの直後に定義されたメソッドinitializeです。純粋なRuby(ruby guide

1

newは、@Bolddrickの答えを拡張するために、Classで定義されており、すべてのクラスで利用可能です。

allocateinitializeの両方が呼び出されています(initializeメソッドが定義されていると仮定します)。

+0

'new'はクラスメソッドとして定義されているとは思いません。 'Class'クラスはそれ自身のインスタンス(yay、circularity!)なので、' Class.new'が動作する理由です。 –

+0

@JörgWMittag私はRuby内部の専門家ではありませんが、ドキュメントでは、正しく呼び出すと、Classクラスのクラスメソッドとインスタンスメソッドの両方が表示されています。 –

+0

実際、これは 'Class#initialize'のドキュメントです。 RDocは 'Class :: new'のドキュメントとして表示しています。 * initializeメソッドを通常どおり*使用する方法なので、* all *クラスのためにこれを行います。あなたは実際にそれを呼ぶわけではありません。ソースコードを見ると、ドキュメンテーションブロックが 'Class#initialize'メソッドに対応する' rb_class_initialize'関数の上にあることがわかります。 –

関連する問題