iT邦幫忙

2021 iThome 鐵人賽

DAY 23
0
Modern Web

網頁前後端寶石庫-礦坑補完計畫系列 第 23

Day 23 Ruby public vs private vs protected

  • 分享至 

  • twitterImage
  •  

public 公開方法

公開方法沒有任何存取限制,可以被該類別或是子層類別的實體呼叫。
一般而言當你定義一個方法後,這個方法就會是公開方法。
或是也可以在方法外的上方加一個 public,public 以下的都會是公開方法,且不用加 end 作區隔,不過通常不會這樣寫。

範例:

class Drama
  public

  def korea
    puts "魷魚遊戲"
  end
  def japan
    puts "今際之國"
  end

end

class Perfect < Drama
  
end

number456 = Drama.new
number456.korea
pokers = Perfect.new
pokers.japan

上述範例定義一個 Perfect 類別繼承自 Drama,兩個類別創造出來的實體都可以呼叫 Drama 內的公開方法。
執行完後會印出魷魚遊戲以及今際之國。

private 私有方法

私有方法是為了要保護功能,防止外部直接存取並使用他,私有方法有兩個限制:

  1. 不能在外面呼叫(存取)他:如果想呼叫他的話要透過公開方法去存取私有方法,也就是把私有方法包在公開方法當中。
  2. 不能指名 receiver 是誰:也就是私有方法前面不能加任何東西,不過這在 Ruby 2.7.0 版本之後有改變了,變成除了 self 以外前面都不能加任何東西。
    如果要讓方法變成私有方法可以在類別裡面寫一個 private,private 以下的方法都會是私有方法。

範例:

class Drama
  def korea
    puts "魷魚遊戲"
  end
  def japan
    puts "今際之國"
  end

  private
  def america
    puts "后翼棄兵"
  end
end

beth = Drama.new
beth.america

上述範例會噴出錯誤訊息:

private method 'america' called for #<Perfect:0x00005637c2aa8020> (NoMethodError)

如果想要呼叫私有方法的話要把他放在公開方法內才行:
範例:

class Drama
  def korea
    puts "魷魚遊戲"
  end
  def japan
    puts "今際之國"
  end
  def good
    america
  end

  private
  def america
    puts "后翼棄兵"
  end
end

lastyear = Drama.new
lastyear.good

上述範例可成功印出后翼棄兵

小知識

puts 本身在整個環境內是一個私有方法,也可使用 self.puts 印出東西。

protected (很少用)

跟 private 一樣功用,也不能在外面直接呼叫他,但可以有明確的 receiver。

參考:
[1]Public, Protected and Private Method in Ruby
[2]Ruby Access Control Basics: Public vs Private vs Protected methods


上一篇
Day 22 Ruby include vs extend vs prepend
下一篇
Day 24 Ruby 哪些不是物件
系列文
網頁前後端寶石庫-礦坑補完計畫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言