这种创建私有类方法的方法是如何工作的:
class Person
def self.get_name
persons_name
end
class << self
private
def persons_name
"Sam"
end
end
end
puts "Hey, " + Person.get_name
puts "Hey, " + Person.persons_name #=> raises "private method `persons_name' called for Person:Class (NoMethodError)"
但这不是:
class Person
def self.get_name
persons_name
end
private
def self.persons_name
"Sam"
end
end
puts "Hey, " + Person.get_name
puts "Hey, " + Person.persons_name
发布于 2011-02-10 11:26:38
如果您在显式对象(在本例中为self
)上定义方法,则private
似乎不起作用。您可以使用private_class_method
将类方法定义为私有(或如您所述)。
class Person
def self.get_name
persons_name
end
def self.persons_name
"Sam"
end
private_class_method :persons_name
end
puts "Hey, " + Person.get_name
puts "Hey, " + Person.persons_name
或者(在拼音2.1+中),由于方法定义返回方法名称的符号,因此也可以按如下方式使用:
class Person
def self.get_name
persons_name
end
private_class_method def self.persons_name
"Sam"
end
end
puts "Hey, " + Person.get_name
puts "Hey, " + Person.persons_name
发布于 2012-09-07 12:07:20
默认情况下,所有类方法都是公共的。要将它们设置为私有,您可以使用Module#private_class_method,就像@tjwallace编写的那样,或者以不同的方式定义它们,就像您做的那样:
class << self
private
def method_name
...
end
end
class << self
开放了self的单例类,因此可以为当前的self对象重新定义方法。用于定义类/模块("static")方法。只有在这里,定义私有方法才能真正提供私有类方法。
发布于 2015-11-05 23:35:04
为了完整性,我们还可以避免在单独的行中声明private_class_method。我个人不喜欢这种用法,但很高兴知道它的存在。
private_class_method def self.method_name
....
end
https://stackoverflow.com/questions/4952980
复制相似问题