web-dev-qa-db-ja.com

Ruby)でプライベートクラス定数を作成する方法

In 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
41
DMisener

定数をクラスメソッドに変更することもできます。

def self.secret
  'xxx'
end

private_class_method :secret

これにより、クラスのすべてのインスタンス内でアクセスできるようになりますが、外部ではアクセスできなくなります。

14
harald

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
150
Renato Zannon

定数の代わりに、常にプライベートである@@ 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は、そもそも一定性を強制するためにほとんど何もしません。

10
sepp2k

上手...

@@secret = 'xxx'.freeze

一種の作品。

0
Anonymous