読者です 読者をやめる 読者になる 読者になる

Rubyのattr_accessorって何?[和訳]

hey guy:) 前回から引き続きstackoverflowの記事を共有したいなと思ったので和訳してみた。
こちらの記事は質問者に697、回答者に1691の"いいね"されている。基本的な質問かもしれないけど読みたくなるよね!

–質問–
I am having a hard time understanding attr_accessor in Ruby.
Can someone explain this to me? I have done tons of Google searches.
I just can’t understand it fully.

訳)Rubyのattr_accessorってなんやねん。誰か説明してくれへんか?ググってもみつからへんわ〜。理解できへん。

–回答–

Let’s say you have a class Person.

Personクラスがあったとしよう。

class Person
end

person = Person.new
person.name # => no method error

Obviously we never defined method name.

明らかにnameメソッドを定義していない。

Let’s do that.

定義してみよう。

class Person
  def name
    @name # simply returning an instance variable @name
  end
end

person = Person.new
person.name # => nil
person.name = "Dennis" # => no method error  

Aha, we can read the name, but that doesn’t mean we can assign the name.

よし、nameメソッドを読み込めた。だが名前を割り当てたわけではない。

Those are two different methods.

2つの別なメソッドがある。

Former called reader and latter called writer.

前者はreaderを後者はwriterを読み込んでいる。

We didn’t create the writer yet so let’s do that.

まだ記述されていないwriterを書いてみよう。

class Person
  def name
    @name
  end

  def name=(str)
    @name = str
  end
end

person = Person.new
person.name = 'Dennis'
person.name # => "Dennis"

Awesome. Now we can write and read instance variable @name using reader and writer methods.

よっしゃ。ついにreaderとwriterメソッドを使うことによってインスタンス変数(@name)を定義して呼び出すことができた。

Except, this is done so frequently, why waste time writing these methods every time?

これはよく使われる。だが、毎回こんなに記述するって時間もったいないと思わないかい?

We can do it easier.

もっと簡単にすることが出来るんだ。

class Person
  attr_reader :name
  attr_writer :name
end

Even this can get repetitive. When you want both reader and writer just use accessor!

まだ面倒くさい感じに書かれている。もしreaderとwriterを同時に書くならaccessorを使おう!

class Person
  attr_accessor :name
end

person = Person.new
person.name = "Dennis"
person.name # => "Dennis"

Works the same way!

同じ結果が返ってきた!

And guess what: the instance variable @name in our person object will be set just like when we did it manually, so you can use it in other methods.

考えてみて。インスタンス変数(@name)はpersonオブジェクトに設定することが出来る。先程私達が頑張ってやったように。
なのでそのオブジェクトを他のメソッドからも呼び出せるよ。

class Person
  attr_accessor :name

  def greeting
    "Hello #{@name}"
  end
end

person = Person.new
person.name = "Dennis"
person.greeting # => "Hello Dennis"

That’s it. こんな感じ。  

追記)readerとwriterはそれぞれゲッター、セッターと呼ばれている。

なるほど〜。実際にターミナルで試した方が感動する!
元となるコードから辿っていくのっておもしろいね!

See you!!:)

リンク

What is attr_accessor in Ruby? - Stack Overflow