Как сделать частные константы класса в Ruby - PullRequest
38 голосов
/ 20 мая 2010

В 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

Ответы [ 4 ]

144 голосов
/ 09 августа 2012

Начиная с 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
12 голосов
/ 20 мая 2010

Вы также можете изменить свою константу в метод класса:

def self.secret
  'xxx'
end

private_class_method :secret

Это делает его доступным во всех экземплярах класса, но не снаружи.

9 голосов
/ 20 мая 2010

Вместо константы вы можете использовать @@ 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's always a way to circumvent privateness in ruby

Конечно, тогда ruby ​​не будет ничего делать для обеспечения постоянства @@ secret, но ruby ​​для начала очень мало делает для обеспечения постоянства, поэтому ...

1 голос
/ 20 мая 2010

Ну ...

@@secret = 'xxx'.freeze

вид работ.

...