gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:13 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com