private, public, protect的差異?

Mino chen
CodeForMyself
Published in
Feb 7, 2021

在寫 Rails 的 controller 中,常使用的方法通常都是 public ,不會特別去寫,而如果不想要被外部取用的方法,就會放在 private 裡面,又稱為:封裝( encapsulation ) ⇒ 把程式包在裡面,外面的人不能使用它。

這個時候我們就要討論到 ⇒ 存取控制

存取控制一共有三種,分別是:private, public, protect。

沒有特別寫的就是 public 外部可以取用這個方法。

寫在 private 底下的話,外部就會找不到這個方法。

也可以在 public 下定義一個 eat 的方法,然後 private :eat 這樣寫,就算放在 public 也會被認定為私有方法。

public 的存取比較沒有什麼異議,但是 private 和 protect 的方法就會比較難分辨。

簡單來說,private 不可以明確指出他的接收者是誰,也就是呼叫 private 裡的方法不可以有小數點,通常我們在外部呼叫方法都會這樣:

kitty = Cat.new

kitty.cool #這樣就可以呼叫裡面的 cool 方法,但如果 cool 方法放在 private就會呼叫不到,因為不能有小數點,可是直接寫 cool 也沒人知道你在呼喚誰,就會看起來像是 private 的方法沒辦法呼叫。

就算在內部存取使用類別方法,也是不可以呼叫的喔,因為存取方法會長這樣 self.cool (一樣有小數點,有小數點就不能呼叫拉!)

這時候 protect 就出現了! protect 介於 public 和 private 中間,在內部存取時可以用小數點,但外部存取一樣不能存取。

其實有兩個小撇步可以偷偷跳過小數點這個規定把 private 的方法叫出來:

  1. 把私有方法包在公有方法裡,再從外部呼叫公有方法
  2. 使用 send 方法直接去撈裡面的方法,kitty.send(:good),這樣的話也沒有違反小數點原則

不過既然人家不想讓你拿 private 方法了,就不要這麼無聊硬要印出來(?)順帶一提, protect 其實是非常少用到的存取方法。

--

--