Day 23 Ruby public vs private vs protected

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


<<:  [DAY30]从上船到沉船30天心得

>>:  企划实现(23)

[第一只羊] 动物园派对桌游设计之迷雾森林

关於迷雾森林故事 序 很久很久以前 在森林的深山林里 有着一群喜欢开趴的动物 就是大家俗称的趴踢 ...

2.3 Design System - Design Token

在学习一个新东西的最初阶段 撞的墙一定是最多的,撑过去就好了! Design token 其实原本...

用 Line LIFF APP 实现信箱验证绑定功能(3) - 修改流程实现认证时效检验

因为前几天我们新增了 verification_code 这张表的栏位,调整了发送认证码的流程,并且...

Day 29: 跨平台比较

Keyword: Flutter 、React Native、KMM 对於只要一份Code就能部署到...

第40天~还是JSON

这篇的上一篇:https://ithelp.ithome.com.tw/articles/10283...