Pregunta

En Rubí cómo se puede crear una constante de clase privada? (Uno es decir que es visible dentro de la clase, pero no fuera)

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
¿Fue útil?

Solución

También puede cambiar su constante en un método de la clase:

def self.secret
  'xxx'
end

private_class_method :secret

Esto hace que sea accesible dentro de todas las instancias de la clase, pero no en el exterior.

Otros consejos

A partir del rubí 1.9.3, usted 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 lugar de una constante que se puede utilizar un @@ 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 el rubí no hará nada para hacer cumplir la constantness de @@ secreto, pero rubí hace muy poco para cumplir constantness para empezar, así que ...

Bueno ...

@@secret = 'xxx'.freeze

tipo de obras.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top