【问题标题】:Ruby: calling private methods from inside with self keywordRuby:使用 self 关键字从内部调用私有方法
【发布时间】:2014-08-22 13:22:40
【问题描述】:
class MyClass
  def test
    puts my_id
    puts self.my_id
  end

  private

  def my_id
    115
  end
end

m = MyClass.new
m.test

此脚本产生一个输出:

115
priv.rb:4:in `test': private method `my_id' called for #<MyClass:0x2a50b68> (NoMethodError)
    from priv.rb:15:in `<main>'

使用self关键字从内部调用方法和不使用它有什么区别?

根据我的 Delphi 和 C# 经验:没有区别,self 可以用来避免与局部变量的名称冲突,表示我要调用实例函数或引用实例变量。

【问题讨论】:

标签: ruby self private-members


【解决方案1】:

在 ruby​​ 中,private 方法只是一个不能用显式接收器调用的方法,即. 左侧的任何东西,self 也不例外,除了 setter 方法(名称以=结尾的方法)

要消除非 setter 方法调用的歧义,您还可以使用括号,即

my_id()

对于私有 setter 方法,即如果您有

def my_id=(val)
end

那么你不能通过添加括号来让 ruby​​ 将其解析为方法调用。您必须使用 self.my_id= 让 ruby​​ 将其解析为方法调用 - 这是“您不能使用显式接收器调用 setter 方法”的例外情况

【讨论】:

  • 有一个例外:您可以使用显式 self 调用私有设置器
  • 所以你可以 - 没想到要试试这个!
  • @Stefan,我认为“可以”应该是“必须”,原因与必须使用 self 调用公共设置器的原因相同。
  • @CarySwoveland 是对的。它应该是:你不能调用私有设置器没有 self,否则它会被解释为分配一个局部变量。
  • 我的措辞相当糟糕 - 在 Stefan 指出我们笨拙地试图说在这种情况下你不能使用括号之后 - 大概这就是偏离一般的动机私有的定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2013-07-12
  • 2010-09-30
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多