tipos modulos mapas constantes clases ruby access-specifier class-constants

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.