Ruby 裡有哪些變數?
共分成以下幾種:
類型範例預設值說明區域變數name無作用範圍僅限在一個區域裡,方法內外不可相互取用。實體變數@namenil在類別中可以被各個方法取用,也可以成為實體物件的屬性,但不同實體物件的屬性不一定相同,類別變數@@name無同一類別建立的實體物件都可以取用,類別不同就無法。全域變數$namenil可以在不同的類別被取用。常數Namenil主要用於類別與常數的命名。
雖然變數有這麼多種,不過由於在實務上很少用到類別變數和全域變數,相對我也沒這麼熟悉,因此這篇將會聚焦介紹 Ruby 的實體變數。
實體變數是什麼?
在 Ruby 裡,我們會在變數的名字前面加一個 @
,來代表實體變數,也可以當作實體物件的屬性(attribute)。
來看一下定義:
實體變數的
scope
是整個類別,因此它能夠在同一類別的方法之間傳遞,而每一個物件的屬性會各別賦值,不會和其他的物件共享,它會隨著不同的物件而有不同的值。
上面這段文字似乎太抽象了,直接看 code 吧:
class Cat
def name
@name
end
end
好像還不太夠,再加上 initialize
試試看:
class Cat
def initialize(name, color)
@name = name
@color = color
end def color
"#{@name}是隻#{@color}色的小貓"
end
end
如此一來,我們就可以在 Cat
類別產生新實體的那一刻,自動把參數指定給實體變數,變成專屬於這個實體的屬性,而不會與其他實體共享。
我們來養一隻小貓:
miru = Cat.new("miru","虎斑")
puts miru.color # 印出
miru是隻虎斑色的小貓
一隻貓不夠吸,養貓就要養兩隻:
nini = Cat.new("nini","黑")
puts nini.color # 印出
nini是隻黑色的小貓
可以看到雖然 miru
和 nini
都使用了同樣的實體變數 @name
和 @color
,但這兩個實體物件各自有屬於自己的屬性,同時,在類別內的實體方法要取用 @name
和 @color
時,也不用再定義這個需要參數。
如果要在類別外取得實體變數?
剛剛有提到,實體變數的 scope 是在整個類別內,不過一旦離開了類別,這個實體變數就不能用了。
因此,如果要在類別外取得這個實體變數,可以這樣做:
class Dog
class Cat
def initialize(name, color)
@name = name
@color = color
end def color
"#{@name}是隻#{@color}色的小貓"
end # getter
def color
@color
end # setter
def color=(new_color)
@color = new_color
end
end
通常會定義一個同名方法來獲得實體變數的值,這個行為被稱作 getter
,
而用這個同名方法加上 =
作為另一個方法來重新傳參數給實體變數,這個行為就叫做 setter
。
didi = Cat.new("didi","橘")
puts didi.color #印出
橘# 重新定義值
didi.color= "橘帶一點黃"
puts didi.color #印出
橘帶一點黃
看到了嗎?我們可以更精準地定義 didi
的顏色啦!
今天就先介紹到這邊啦!關於 getter
和 setter
的使用方式,明天還會再看到它們!