【问题标题】:Calling a private method xxx using self.xxx() from within another private method resulting in error "private method `xxx' called"在另一个私有方法中使用 self.xxx() 调用私有方法 xxx 导致错误“调用私有方法 `xxx'”
【发布时间】:2012-08-12 16:11:16
【问题描述】:

我正在尝试获得良好的 Ruby 编码风格。为了防止意外调用同名的局部变量,我总是在适当的地方使用self.。但现在我偶然发现了这个:

class MyClass < ActiveRecord::Base
  before_validation :sanitize_user_data

  private

  def sanitize_user_data
    self.sanitize_name # with ".self" it's a problem, without it's not!
  end

  def sanitize_name
    unless self.name.nil?
      self.name.gsub!(/\s+/, ' ')
      self.name.strip!
    end
  end
end

以上代码导致错误

调用私有方法sanitize_name

但是当删除 self. 并仅使用 sanitize_name 时,它可以工作。这是为什么呢?

【问题讨论】:

    标签: ruby private


    【解决方案1】:

    发生这种情况是因为不能使用显式接收器调用私有方法,并且说self.sanitize_name 是显式指定应该接收sanitize_name 的对象(self),而不是依赖于隐式接收器(这也是@ 987654324@).

    您无法避免这种情况,您要么需要在没有明确接收者的情况下调用普通的旧 sanitize_name,要么调用 self.send(:sanitize_name)。我不确定总是明确指定self 真的是“好风格”,但这是主观的。如果要确保调用的是方法而不是变量,请添加括号:

    def a; "method"; end
    a = "variable"
    a() #=> "method"
    a   #=> "variable"
    

    【讨论】:

    • 感谢您的解释。我会记住这一点,但我想要真正理解它,我必须深入挖掘 Ruby 的内部结构,对吧?
    • @JoshuaMuheim 不一定,这只是私有方法的工作方式,通过禁止显式接收器不能从任何地方调用隐式接收器不一样self,它只是有点阻止您使用与隐式接收器相同的显式接收器调用私有方法的不幸副作用。
    • 好的,这很有趣。非常感谢您的解释。 :)
    【解决方案2】:

    为什么?

    根据定义。私有方法只能由无接收消息发送调用,这就是private 的含义的定义

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 2021-08-31
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      相关资源
      最近更新 更多