52

在 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
4

4 回答 4

169

从 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
于 2012-08-09T14:09:52.943 回答
13

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

def self.secret
  'xxx'
end

private_class_method :secret

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

于 2010-05-20T13:22:50.303 回答
11

您可以使用@@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​​ 一开始就不会强制执行恒定性,所以......

于 2010-05-20T13:19:04.613 回答
0

好...

@@secret = 'xxx'.freeze

种作品。

于 2010-05-20T14:41:57.257 回答