1

Rubyのattr_writerと混同しています。配列内に値を追加しようとしていますが、次のエラーが発生しています:

13 行目: 未定義のメソッド `test' for # (NoMethodError)

class Pet
  attr_writer :test
  def initialize()
    @test = []
  end
end

pet = Pet.new()
pet.test << "Test was a pet"

なんで?私が理解しているように、attr_writer は setter メソッドに相当します。説明してください。ありがとうございました。

4

2 に答える 2

7

はい、attr_writersetter メソッドを定義します。しかし、あなたのコードはゲッターを使用しようとします

pet.test << "Test was a pet"

これがルビーの見方です(多かれ少なかれ)

t = pet.test
t << "Test was a pet"

実際に配列を設定するとうまくいきます

pet.test = ['Test was a pet']

補足として、私は個人的に書き込み専用プロパティをコードの匂いと考えています。ここで何かが間違っている可能性があります。私のキャリアでは、書き込み専用属性を使用する必要はありませんでした。

于 2013-01-24T07:51:59.867 に答える
-1

最良の方法は、attr_accessorメソッドを使用することです。このようにして、1 行のコードでセッター変数とゲッター変数を定義できます。アクセサー メソッドを使用すると、定義済みのインスタンス変数値を取得するか、別の値を設定できます。

あなたのコードでは、メソッドがセッターとして定義されていても、ゲッターメソッドを初期化しようとしています。

attr_accessor :test
...
print pet.test << "Test was a pet" # => ["Test was a pet"]
于 2013-01-24T08:01:31.150 に答える