ruby - 调用对象自己的私有方法时Ruby失败?
问题描述
puts 方法在模块 Kernel 中被定义为私有。所以没有人可以执行其他对象 puts - 这很清楚。但是为什么尽管 self 和 slf 具有相同的 ID,但下面的示例没有运行?它们不是同一个对象吗?
>> slf = self
>> slf.puts
(irb):206:in `<main>': private method `puts' called for main:Object (NoMethodError)
from C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/irb-1.3.5/exe/irb:11:in `<top (required)>'
from C:/Ruby30-x64/bin/irb:25:in `load'
from C:/Ruby30-x64/bin/irb:25:in `<main>'
>> p self.object_id
320
>> p slf.object_id
320
解决方案
Ruby 中的私有方法只能通过无接收者的消息发送来调用,即self
作为隐式接收者,或者使用文字伪变量self
作为显式接收者。
IOW,允许的两种方式是
foo(args)
和self.foo(args)
.
在您的示例中,您正在发送一条消息,其中接收者是局部变量slf
,即既不是隐式的,也不是文字的伪变量self
,因此,不允许调用私有方法。
推荐阅读
- python - 无法设置/覆盖 docker 入口点以执行两个命令
- python - 通过知道值来增加键 - python字典
- python - sklearn 谱聚类导致的聚类数量少于集合
- google-apps-script - 用于文档表格单元格宽度的 Google Apps 脚本 getWidth() 返回 null
- javascript - 无法将所有反斜杠替换为从 \ 到 / 的正斜杠“
- c++ - 如何告诉 stringstream 忽略空终止字符?
- vb.net - 动态生成图片框
- java - 如何最小化层次结构的代码量
- javascript - 当用户不与机器人共享任何公会时从数据库中删除用户
- java - HTTP 状态 500 – 内部服务器错误。JSP servlet 的问题