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的意思囉!簡單來說,由於符號是獨特的,因此才能代表我們真正要使用的物件,所以這種時候都會帶入符號,而非一般字串或變數。