ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called”

标签 ruby private

我正在尝试获得良好的 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

上面的代码导致错误

private method sanitize_name called

但是当删除 self. 并仅使用 sanitize_name 时,它会起作用。这是为什么?

最佳答案

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

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

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

关于ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11923672/

相关文章:

Java-私有(private)内部类公共(public)成员

私有(private)以太坊 maxpeer

java - 从其他类访问数据

ruby - Cocoapods 指向错误的版本

ruby - 使用 Mechanize 检索网站的所有链接

ruby - 如何重命名节点属性

c++ - 如何从另一个类访问私有(private)变量?

java - 如何避免忘记在类里面将属性设为私有(private)

ruby - 有没有更简洁的方法来组合 Ruby 中的许多比较?

ruby - Net :Http and third-party library for making API calls in Rails/Ruby?有什么区别