2016-10-25 8 views
4

のは、通常のRubyのクラスを見てみましょう:Rubyクラスのインスタンスメソッドdef initialize:インスタンスまたはクラスメソッド?

class Person 
    attr_accessor :name 
    def initialize name 
    @name = name 
    end 
end 

bob = Person.new("bob") 

私の質問は、初期化の性質です。ここでは、newは明らかにクラスメソッドですが、initializeはクラスメソッドnewが呼び出されたときに作成されたインスタンスで呼び出されるインスタンスメソッド(クラスではない)です。

私はこの権利を持っていますか?または、誰かが新しい光を放つことができますか?私はいくつかのGoogleの検索を行っており、明確さを見つけることができませんでした。次に、新しいオブジェクトが初期化されている

+1

これは一種のものです。インスタンスメソッドのスコープにはアクセスできますが、それはクラスメソッドのように呼び出し可能です。 'def self.new'を定義すると、initializeは呼び出されません。 –

+0

これは、 'new'メソッドが呼び出された結果として呼び出されることを意味しますか?実際には 'new'メソッドですか? –

+0

はい。また、[Module#attr_accessor](http://ruby-doc.org/core-2.0.0/Module.html#method-i-attr_accessor)は、2つのインスタンスメソッド(ここでは 'name'と 'name =')。 –

答えて

3

(あなたはクラスでnewを呼び出すときには、ある)、これは効果的に呼び出されるものですが、この方法です:

class Class 
    def new(*args, &block) 
    obj = allocate 
    obj.send(:initialize, *args, &block) 
    obj 
    end 
end 

標準のRuby実装では、この方法がで実装されていますCであるが、well documentedである。

ここで何が起きているのかを理解するには、RubyでもクラスでさえObject(インスタンスまたはClassクラス)であることに注意する必要があります。したがって、Personクラスのnewを呼び出すときは、実際にClassオブジェクトのインスタンスでnewメソッドを呼び出しています。

ご覧のとおり、Personクラスは、新しいインスタンスにメモリを割り当てる方法を提供します。メモリが割り当てられた後、newメソッドは新しく作成されたインスタンスのinitializeを呼び出します。

+0

そのコードスニペットは完璧です、ありがとうございます –

+0

実際には、 'initialize'はデフォルトで' private'ですので、真ん中の行は 'obj.send(:initialize、* args、&block)'のようになりますが、最終結果は同じです。 'Foo.alloc.init'は本質的にオブジェクトをどのように作成するのか、Objective-Cを使ったことがある人はよく知っているはずです。 –

+0

ありがとう@JörgWMittag。私はコードを修正し、メソッドのディスパッチがC-Rubyでどのように機能するかについてもう少し学んだ。 –

関連する問題