類別方法 <> 雜魚們!為革命軍獻出你們的心臟吧!

https://ithelp.ithome.com.tw/upload/images/20200923/20128363fMf7riXQNQ.jpg

[Day14] 大家認識這位嗎?革命軍「東軍」軍隊長-貝洛貝蒂,她的鼓舞果實能力可以讓周遭的人全都變成有戰鬥力的單位,簡直就是類別方法啊!

在看完昨天有趣的模組後,今天想要重新回到類別(Class)這個大主題,來跟大家介紹類別方法和實體方法的差異。

那就開始吧!


實體方法

顧名思義,實體方法(instance method)就是作用在實體上的方法。基本上,類別裡面一般都會是實體方法,但我這邊還是重新快速帶一下觀念。

舉個例子,像是知名的電商網站叫 Shopee,在這個網站註冊的會員,都可以使用 Shopee 提供的服務:購買商品、上架販售等等。

我們來看看程式會怎麼寫上面這段話:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Shopee
def buyer
puts "成為買家,在雙11掃光所有的貨!"
end

def seller
puts "成為賣家,所有的錢都進來我的口袋!"
end
end

me = Shopee.new

me.buyer
me.seller

# 印出
成為買家,在雙11掃光所有的貨!"
成為賣家,所有的錢都進來我的口袋!

類別方法

要定義類別方法有好幾種方式,我最常用的是在方法名稱的前加上 self.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Army
def fight # 實體方法
puts "我要打倒天龍人!"
end

def self.inspire # 類別方法
puts "全部的人都起身戰鬥!"
end
end

soldier = Army.new

soldier.fight
Army.inspire

# 印出
我要打倒天龍人!
全部的人都起來戰鬥!

如果要定義很多類別方法,也可以這樣寫:

1
2
3
4
5
6
7
class Army
class << self # 這行以下寫的方法就是類別方法,前面不用再加 self
def all
# ...
end # 一直到這
end
end

為什麼要有類別方法?什麼時候用?

通常我們要直接請類別幫忙時,就會使用類別方法。換句話說,當我們確定這個方法和特定實體不會有關係,而是要在整個類別操作,就會考慮使用類別方法。


初始化

最後,來向大家介紹一個特別的方法「初始化(initialize)」這又是什麼?很像是重灌電腦時才會聽到的單字,是不是覺得有點危險呢?

其實在 Ruby 的類別裡, initialize 指的是:在類別產生實體當下就會立刻執行的方法,也可以想成是寶寶一出生就會做的第一件事(?)

1
2
3
4
5
6
7
8
class Baby
def initialize
puts "Hello World(crying!!!)"
end
end

baby = Baby.new
Hello World(crying!!!)

Wow!寶寶一出生就會 Hello World 了!看來絕對是當工程師的料啊!
(喂!寶寶在哭了!!!)


今天就先到這邊了!希望大家都有看懂類別方法在做什麼,也希望五倍的大家可以順利完賽!(信心喊話)

參考資料:
蒼時弦也 - 自由的 Ruby 類別(一)