Ruby 當中的attr_accessor是什麼意思?
在Stackoverflow上看到一篇關於attr_accessor
非常入門的文章,對於我這種Rails用習慣卻對Ruby原理不熟的人來說獲益良多。
一個Ruby程式當中會有許多class
,但內容空無一物的class並不會任何變數,例如:
class Car
end
car = Car.new
car.color # NoMethodError: undefined method "color"
car.color = "blue" # NoMethodError: undefined method "color"
我們要讀取及修改這個class當中的color
變數,但因為什麼都還沒有設定,所以出現錯誤。我們要設定一個變數:
class Car
def color
end
end
car = Car.new
car.color # nil
car.color = "blue" # NoMethodError: undefined method "color="
因為什麼都還沒設定,因此car.color
回傳值是空白;不過更值得注意的是當我們要指定數值給color
這個變數的時候,Ruby會自動去抓color=
這個method,因此我們也需要先建立一個相對應的method。
class Car
def color
end
def color=(string)
end
end
car = Car.new
car.color # nil
car.color = "blue" # nil
car.color #nil
注意我們雖然有設定了color=
這個method,但我們裡面需要一個變數,否則都只是空的method。
class Car
def color
@color
end
def color=(string)
@color = string
end
end
car = Car.new
car.color # nil
car.color = "blue" # blue
car.color # blue
這樣就完成囉!但由於在Ruby當中這是非常基本的用法,常常出現,因此Ruby已內建幾個method來幫我們建立這樣的模式。
class Car
attr_reader :color
attr_writer :color
end
兩個method將讀和寫分開,會自動建立一個@color
變數給我們。更簡略的寫法是:
class Car
attr_accessor :color
end
非常簡單的完成了!
假如還想知道為什麼是pass :color
這個前面加上:的變數,而非一般的變數,那就要了解一下Ruby當中symbol的意思囉!簡單來說,由於符號是獨特的,因此才能代表我們真正要使用的物件,所以這種時候都會帶入符號,而非一般字串或變數。