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!!:)
リンク