5

ruby オブジェクトは、インスタンス変数 (およびクラス ポインター) を格納できる場所にすぎないと読んだことがあります。そう:

class Person
  def initialize(age)
    @age = age
  end
end

実行すると、次のようになります。

p = Person.new(101)

次に、次のようになります。

#<Person:0x86cf5b8 @age=101>

すばらしい、予想どおり、プロパティageインスタンス変数として格納されます。しかし、モデルを ActiveRecord から継承するように変換すると、動作が少し異なります。さて、新しい Person をインスタンス化すると、次のようになります。

# timestamps removed
#<Person id: 1, age: 101 > 

ageプロパティは、インスタンス変数のようには見えなくなりました。では、ここで実際に何が起こっているのでしょうか。

すべてのプロパティと値のハッシュを含むインスタンス変数にアクセスできることはわかっている@attributesので、ActiveRecord がコンソール出力を変更してオブジェクトの属性をこのように表示する可能性があるかどうか疑問に思っています。

ActiveRecordを使用せずに、プロパティがインスタンス変数ではなく属性として保持されるRubyオブジェクトをインスタンス化することは可能ですか?

4

3 に答える 3

3

はい、Ruby クラスを で拡張してinclude ActiveModel::AttributeMethods、インスタンス変数をActiveModel-like 属性として公開できます。

詳細については、ドキュメントを参照してください。

于 2012-06-07T13:30:54.037 に答える
1

コードに見られるように、インスタンス変数としてのプロパティの「保存」はあなた自身が行っていたので、他の方法でそれらを保持したい場合も、あなた次第です。rubyは、attr_accessorのようなgetterメソッドとsetterメソッドを定義するための便利なクラスメソッドを提供します。

また、ActiveRecord :: Baseから継承する場合は、initializeをオーバーライドしないでください。

于 2012-06-07T13:37:20.467 に答える