如何在Ruby中创建私有类常量

时间:2010-05-20 13:02:09

标签: ruby access-specifier class-constants

在Ruby中如何创建私有类常量? (即在课堂内可见但不在课堂外可见的)

class Person
  SECRET='xxx' # How to make class private??

  def show_secret
    puts "Secret: #{SECRET}"
  end
end

Person.new.show_secret
puts Person::SECRET # I'd like this to fail

5 个答案:

答案 0 :(得分:144)

从ruby 1.9.3开始,你有Module#private_constant方法,这似乎正是你想要的:

class Person
  SECRET='xxx'.freeze
  private_constant :SECRET

  def show_secret
    puts "Secret: #{SECRET}"
  end
end

Person.new.show_secret
# => "Secret: xxx"

puts Person::SECRET
# NameError: private constant Person::SECRET referenced

答案 1 :(得分:12)

您还可以将常量更改为类方法:

def self.secret
  'xxx'
end

private_class_method :secret

这使得它可以在类的所有实例中访问,但不能在外部访问。

答案 2 :(得分:9)

而不是常量,你可以使用@@ class_variable,它总是私有的。

class Person
  @@secret='xxx' # How to make class private??

  def show_secret
    puts "Secret: #{@@secret}"
  end
end
Person.new.show_secret
puts Person::@@secret
# doesn't work
puts Person.class_variable_get(:@@secret)
# This does work, but there's always a way to circumvent privateness in ruby

当然,ruby将无法执行@@ secret的常量,但ruby在开始时不会强制执行常量,所以......

答案 3 :(得分:1)

嗯...

@@secret = 'xxx'.freeze

有点作品。

答案 4 :(得分:1)

现在,有一个private_constant

class Person
  SECRET='xxx' # How to make class private??

  private_constant :SECRET
  def show_secret
    puts "Secret: #{SECRET}"
  end
end

Person.new.show_secret
puts Person::SECRET #=> NameError: private constant Person::SECRET referenced