0

次の例では、すべてが論理的です。

class Something
    def initialize
        @x=101
    end

    def getX
        return @x
    end
 end

obj = Something.new
puts obj.getX
=>101

Something.new は、クラス Something のすべてのメソッドに表示されるインスタンス変数 @x を使用して、クラス Something の新しいインスタンスを作成します。

しかし、initialize(constructor) メソッドを使用しない 2 番目の例ではどうなるでしょうか。

class Something
    def bla_bla_method
        @x=101
    end

    def getX
        return @x
    end
 end

obj = Something.new
puts obj.getX
=>nil
obj.bla_bla_method
puts obj.getX
=>101

bla_bla_method が呼び出されると、(コンストラクターのように) 新しい instance_variable @x が作成され、すべてのメソッドで再び使用できる「インスタンス変数テーブル」にそのインスタンス変数が追加されますか?

したがって、クラスSomethingに新しいメソッド「new_method」を追加すると(2番目の例):

def new_method
    @x=201
end
...
obj.bla_bla_method
puts obj.getX
=>101

obj.new_method
puts obj.getX
=>201

それで、私がこれを正しく理解しているなら、クラスのすべてのメソッドは、クラスのすべてのメソッドで利用できる新しいインスタンス変数を作成できますか? そして、すべてのメソッドがそのインスタンス変数を何度も上書きできますか (周期的)?

私はルビーに慣れていないので、ここで大きな間違いを犯しているか、基本的な概念を理解していない可能性があります。大声で叫ばないでください:D

4

2 に答える 2

2

オブジェクトのインスタンス変数は、オブジェクトが存在する間、名前を付けて操作できます。irb プロンプト オブジェクトを使用している場合は、次の例を参照してください。

$ irb
> instance_variables    # => [:@prompt]
> @foo                  # => nil
> instance_variables    # => [:@prompt]
> @foo = 1              # => 1
> instance_variables    # => [:@prompt, :@foo]
> @foo                  # => 1

さて、Class#newドキュメントからの説明は次のとおりです。

クラスのクラスの新しいオブジェクトを作成するために allocate を呼び出し、次にそのオブジェクトの initialize メソッドを呼び出して、 argsを渡します。これは、オブジェクトが .new を使用して構築されるたびに呼び出されるメソッドです。

これを考える 1 つの方法はinitialize、他のインスタンス メソッドと同じように、機能的には通常のメソッドであるというClass#newことです。(とりわけ) デフォルト値を設定する簡単な方法を提供するために呼び出されるだけです。

于 2013-10-22T18:50:19.273 に答える
1

技術的には、はい。しかし、オブジェクト指向プログラミングの概念を考慮してください - クラスとオブジェクトの形で現実世界の抽象化を作成します。

たとえば、学校の生徒について話しているとします。あなたはそれが抽象化可能なエンティティであることを知っています。したがって、学生の共通の特性をクラス Studentにカプセル化します。

initializeコンストラクタです。システムで新しい学生を作成するとき、当然、彼の名前年齢クラスなど、彼に関する必要な詳細をいくつか提供したいと思うでしょう。したがって、initializeメソッドでこれらのインスタンス変数を設定します。

学校でも勉強する生徒はほとんどいません。当然のことながら、彼らはある程度の成績などを獲得します。生徒に関するこれらの詳細をインスタンス化するには、次のようにします。

#Student(name, age, class)
kiddorails = Student.new("Kiddorails", 7, 2)
#to grade:
kiddorails.set_grades
#do stuff

そのため、クラス内のほぼどこでも、オブジェクト内のインスタンス変数を変更および設定できます。しかし、ポイントは -それが理にかなっている場所でそれを行う.

initializePS: 必要に応じて、 in経由で設定されていないインスタンス変数に常にデフォルト値を設定initializeする必要があります。

于 2013-10-22T18:35:33.013 に答える