你必須很努力

Ruby 裡的 self 是什麼意思

2019/09/14
字數統計: 448閱讀時間: 1 min

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>


參考:

  1. 為你自己學 Ruby on Rails -類別(Class)與模組(Module)
  2. Ruby 使用手冊 - 變數 Variables
  3. 關於 self
  4. 理解 Ruby 中的self

原文連結:https://riverye.com/2019/09/14/Ruby-裡的-self-是什麼意思/

發表日期:2019-09-14

更新日期:2019-10-25

CATALOG
  1. 1. 1. self:永遠指示目前正在執行的物件
  2. 2. 2. nil:這是指派予未初始化 (uninitialized) 變數的無意義值。
  • 在 Ruby 中,self 代表預設的訊息接收者,不同的範圍或呼叫方式,self 代表的物件也不相同。