今天來聊聊 ruby 裡的 attr_accessor,為什麼我們要用 attr_accessor,假如你有一個類別裡面有實體變數,而你想要在外面也使用它們,那你要怎麼做呢?在這裡就必須要定義一個方法,因為只有方法能夠存取實體變數,那又是為什麼呢?因為你不這樣做的話會噴錯,就是這樣。
class User
def initialize(name)
@name = name
end
end
person = User.new('ruby')
person.name
NoMethodError: undefined method `name`
當沒有做好設定就要取用那個 person 的 name 就會產生這個錯誤NoMethodError
,那解決方法就是你定義一個自己的方法將是這樣:
class User
def name
@name
end
end
#ruby
在其他物件導向的語言裡上面這個段叫做 getter 方法,你定義一個方法可以拿到實體變數的值,接下來你也許會想要改變這裡面的值,為了做到這件事情你就必須要有另一個方法,像是這個:
class User
def name=(value)
@name = value
end
end
person.name = rails
想像你正在打開一個可以進入物件裡面並且修改物件的值的傳送門,這就是上面這段做的事情,既然都到這裡了,那有沒有正好的方法來定義這些方法勒?像是捷徑之類的。
答案是有的, attr_accessor 這不就來了!
你可以透過 attr_accessor 來告訴 ruby 來建立這些方法,如下:
class User
attraccessor :name
def initialize(name)
@name = name
end
end
現在看看下面這行,就是這段幫你建立另外兩個方法給你attr_accessor :name
什麼方法勒?
name
name=
這不跟之前建立的方法一模一樣嗎?是的沒錯,但是這樣做的話你就不用把他們敲出來了,都說了這是個捷徑。
attr_accessor
attr_reader
attr_writer
他們之間有什麼不一樣的嗎?
attr_accessor 可以幫你建立 READER & WRITER 方法,attr_reader只會幫你建立 reader ,attr_writer 也只會幫你建立 writer ,換句話說,有了 attr_reader 你只能夠拿到值但是不能夠修改,而 attr_writer 能夠讓你修改值卻不能夠讀取值。
最後
有多個實體變數,想要定義多個屬性方法?
只要用對的語法,那你可以這樣做
attr_reader :name, :value, :ready?
用上面這個語法想做幾個就做幾個
以上