In Ruby how does one create a private class constant? (i.e one that is visible inside the class but not outside)
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
You can also change your constant into a class method:
def self.secret
'xxx'
end
private_class_method :secret
This makes it accessible within all instances of the class, but not outside.
Renato Zannon
Starting on ruby 1.9.3, you have the Module#private_constant
method, which seems to be exactly what you wanted:
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
Instead of a constant you can use a @@class_variable, which is always private.
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
Of course then ruby will do nothing to enforce the constantness of @@secret, but ruby does very little to enforce constantness to begin with, so...
Well...
@@secret = 'xxx'.freeze
kind of works.
来源:https://stackoverflow.com/questions/2873903/how-to-i-make-private-class-constants-in-ruby