modulos - Cómo puedo hacer constantes de clases privadas en Ruby
modulos ruby (4)
A partir de ruby 1.9.3, tiene el método Module#private_constant
, que parece ser exactamente lo que quería:
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
En Ruby, ¿cómo se crea una constante de clase privada? (es decir, uno que es visible dentro de la clase pero no afuera)
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
Bien...
@@secret = ''xxx''.freeze
tipo de obras.
En lugar de una constante, puede usar @@ class_variable, que siempre es privada.
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
Por supuesto, entonces Ruby no hará nada para imponer la constancia de @@ secret, pero ruby hace muy poco para imponer la constancia para empezar, así que ...
También puede cambiar su constante en un método de clase:
def self.secret
''xxx''
end
private_class_method :secret
Esto lo hace accesible en todas las instancias de la clase, pero no en el exterior.