首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建私有类方法?

如何创建私有类方法?
EN

Stack Overflow用户
提问于 2011-02-10 11:10:19
回答 6查看 110.1K关注 0票数 239

这种创建私有类方法的方法是如何工作的:

代码语言:javascript
复制
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)"

但这不是:

代码语言:javascript
复制
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
EN

回答 6

Stack Overflow用户

发布于 2011-02-10 11:26:38

如果您在显式对象(在本例中为self)上定义方法,则private似乎不起作用。您可以使用private_class_method将类方法定义为私有(或如您所述)。

代码语言:javascript
复制
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+中),由于方法定义返回方法名称的符号,因此也可以按如下方式使用:

代码语言:javascript
复制
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
票数 295
EN

Stack Overflow用户

发布于 2012-09-07 12:07:20

默认情况下,所有类方法都是公共的。要将它们设置为私有,您可以使用Module#private_class_method,就像@tjwallace编写的那样,或者以不同的方式定义它们,就像您做的那样:

代码语言:javascript
复制
class << self

  private

  def method_name
    ...
  end
end

class << self开放了self的单例类,因此可以为当前的self对象重新定义方法。用于定义类/模块("static")方法。只有在这里,定义私有方法才能真正提供私有类方法。

票数 87
EN

Stack Overflow用户

发布于 2015-11-05 23:35:04

为了完整性,我们还可以避免在单独的行中声明private_class_method。我个人不喜欢这种用法,但很高兴知道它的存在。

代码语言:javascript
复制
private_class_method  def self.method_name
 ....
end
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4952980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档