Ruby 中有三種變數,一種常數、兩種擬變數(pseudo-variable),其中的兩個擬變數 (pseudo-variable):
1. self:永遠指示目前正在執行的物件
2. nil:這是指派予未初始化 (uninitialized) 變數的無意義值。
這兩個都如同區域變數,self 是由直譯器維護的全域變數;而 nil 則是一個常數。
備註:你不能為 self 或 nil 指派任何值。
在 Ruby 中,self 代表預設的訊息接收者,不同的範圍或呼叫方式,self 代表的物件也不相同。
講得很清楚,聽的很模糊嗎? 沒關係,直接看以下實作會比較清楚
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62# 最頂層預設值如下:
puts self # main
puts self.is_a? Object # true
puts self.instance_of? Object # true
# ---------------
# 其中,要特別留意, self 無法呼叫 private 內的方法,
# self.puts "Hello World"
# 會印出 private method `puts' called for main:Object (NoMethodError)
# 唯一例外,是在類別中的方法呼叫指定方法時
class Some
def initialize(value)
self.value = value # 10
end
def value=(v)
@value = v # 10
end
private :value=
def value
@value # 10
end
end
s = Some.new(10)
s.value # 10
# ---------------
# self 指示目前正在執行的物件
class Cat
self # Cat,表示指向當前類別
def hello #實體方法
self # #<Cat:0x00007fffb9fed560>,指向當前實體
end
def self.world #類別方法
self # Cat,表示指向當前類別
end
end
p kitty = Cat.new # #<Cat:0x00007fffef6091a8>
def kitty.meow
p self # #<Cat:0x00007fffef6091a8>,指向當前這個實體
end
module Fly
self # Fly,表示指向當前模組
def fly
puts self # 如果是用實體include這個模組,指向該實體
# 如果是用類別extend這個模組,指向該類別
end
end
kitty.hello # #<Cat:0x00007fffef6091a8>
Cat.world # Cat
kitty.meow # #<Cat:0x00007fffef6091a8>
參考: