在 Ruby 中,存取控制主要依賴於存取修飾符,它們定義了物件的屬性和方法在不同情況下的可見性,可以說是有些功能不想讓外部直接使用,所以 Ruby 提供了三個主要的存取修飾符:public
、private
和 protected
。
在默認的情況下,所有的方法都是公開的,可以從物件的外部存取,這表示你可以在任何地方調用這些方法,簡單來說沒特別說明的都是公開的方法
在下方的程式碼中,由於是公開的方法所以魯夫也會用三刀流奧義
class Swordsman
def three_swords
puts "三刀流奧義·三千世界"
end
end
luffy = Swordsman.new
luffy.three_swords # 可以使用 three_swords 方法
私有方法只能在類別內部取用,無法從物件的外部取用,通常用於不希望或是不必要讓外部去取用的方法,將它們隱藏放在私有方法裡面,所以下方的情況下,連索隆自己都無法使用三刀流three_swords
class Swordsman
private
def three_swords
puts "三刀流奧義·三千世界"
end
end
zoro = Swordsman.new
zoro.three_swords #取用失敗 印出undefined method `three_swords' for ...
private = 不能有明確的訊息接收者 (receiver) 也可以說是呼叫方法的時候不會有小數點,改成下方使用一個公開use_sword
方法去呼叫私有three_swords
方法,這樣一來索隆就可以正常使用三刀流這個私有方法拉three_swords
小知識: 在 Ruby 的存取控制跟別的程式語言不一樣 zoro 呼叫use_sword 方法比較像是給 zoro 這個物件送了一個 use_sword 的訊息
zoro.use_sword
zoro = 接收者
use_sword = 訊息
class Swordsman
def use_sword
three_swords
end
private
def three_swords
puts "三刀流奧義·三千世界"
end
end
zoro = Swordsman.new
zoro.use_sword # 成功印出 三刀流奧義·三千世界
受保護的方法可以在同一個類別內的其他方法中使用,也可以在子類別中使用,它們通常用於實現某些保護性的操作,簡單來說 protect = 不限定有沒有明確的訊息接收者
class Swordsman
def use_sword
self.three_swords
end
protected
def three_swords
puts "三刀流奧義·三千世界"
end
end
zoro = Swordsman.new
zoro.use_sword # 成功印出 三刀流奧義·三千世界
這樣即使前面有沒有小數點.索隆都可以用三刀流奧義
Day 13 預計繼續介紹物件導向程式設計(四),我們明天見!