【问题标题】:Ruby Failure while calling an objects own private method?调用对象自己的私有方法时Ruby失败?
【发布时间】:2021-12-20 07:16:33
【问题描述】:

方法 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 methods private self


    【解决方案1】:

    Ruby 中的私有方法只能通过无接收者的消息发送来调用,即使用 self 作为隐式接收者,或者使用文字伪变量 self 作为显式接收者。

    IOW,允许的两种方式是

    • foo(args)
    • self.foo(args)

    在您的示例中,您发送的消息接收者是局部变量slf,即既不是隐含的,也不是文字伪变量self,因此,不允许调用私有方法。

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 2013-07-05
      • 1970-01-01
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2015-06-26
      • 1970-01-01
      相关资源
      最近更新 更多