Ответ 1
Вы также можете изменить константу в методе класса:
def self.secret
'xxx'
end
private_class_method :secret
Это делает его доступным во всех экземплярах класса, но не снаружи.
В 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
Вы также можете изменить константу в методе класса:
def self.secret
'xxx'
end
private_class_method :secret
Это делает его доступным во всех экземплярах класса, но не снаружи.
Начиная с 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
Вместо константы вы можете использовать @@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 always a way to circumvent privateness in ruby
Конечно, рубин не будет делать ничего, чтобы обеспечить постоянство @@secret, но рубин делает очень мало, чтобы обеспечить постоянство для начала, поэтому...
Ну...
@@secret = 'xxx'.freeze
вид работ.