記得之前講到變數與常數,其中有一個@開頭的,我們稱它為實體變數。在類別中,它是一個可以讓所有的方法共用得變數,而且與每個實體之間並不會互相影響。
實體變數很常見,我們隨機開啟一個專案裡,就會看到@candidates
class CandidatesController < ApplicationController
def index
@candidates = Candidate.order(vote: :desc)
end
… (略)
又或者在view裡
<%= @candidates.name %>
以上@candidates這樣的寫法就是一個實體變數。
在類別裡面,必須先把new方法所傳進來的參數先進行初始化(initialize)之後才能使用,因為在initialize這方法裡,會將參數傳進來給內部的實體變數。
首先要先知道,實體變數沒辦法直接從外部直接取用,從以下例子來看
class Girl
def initialize(name, age)
@name = name
@age = age
end
def say_hi
puts "你好,我是 #{@name},今年 #{@age} 歲"
end
end
girl = Girl.new("Sophia", 3)
girl.say_hi # => 你好,我是 Sophia,今年 3 歲
puts girl.name # => NoMethodError
像這樣直接取用會發生NoMethodError的錯誤訊息。
如果還是想要取用實體變數,那我們必須另外定義的方法才行。
class Girl
… (略)
def name
"我是#{@name}"
end
end
girl = Girl.new("Sophia", 3)
puts girl.name # => 我是Sophia
其實還可以使用Ruby內建的方法,attr_reader,attr_writer以及attr_accessor,那這邊我們就先使用 以換成另一種方法,attr_accessor
這個可讀可寫的方法,就可以正常使用了
class Girl
attr_accessor :name,:age
def initialize(name, age)
@name = name
@age = age
end
def say_hi
puts "你好,我是 #{@name},今年 #{@age} 歲"
end
end
girl = Girl.new("Sophia", 3)
puts girl.name # => Sophia
puts girl.age # => 3
然後這邊小提醒,不要把「@」手誤打成「@@」類別變數(class Variable),因為類別變數除了在自己的class使用之外,為因為繼承關係,所以也可以直接在其他得class使用,為了避免日後專案出錯,建議小心服用(但聽建議是說不要亂嘗試啦~
class Animal
@@cat = :a
@dog = :b
def self.cat
@@cat
end
def self.dog
@dog
end
end
class Zoo < Animal
end
p Animal.dog # :b
p Zoo.dog # nil
p Animal.cat # :a
p Zoo.cat # :a
關於類別變數,菜鳥接觸程式不久,還沒用過也沒遇過~
等我哪天真的手誤了再來發敲一篇心得好了。
參考連結:
為你自己學 Ruby on Rails