在Ruby中,如何創建私有類常量? (即一個是在類中可見,但不被外部)如何在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
在Ruby中,如何創建私有類常量? (即一個是在類中可見,但不被外部)如何在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
取而代之的是一直不變的,可以使用@@ 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
當然然後紅寶石將無助於加強@@祕密constantness,但紅寶石几乎沒有去執行constantness開始用,所以...
謝謝......在事後看來似乎很明顯。 – DMisener 2010-05-25 15:22:50
嗯......
@@secret = 'xxx'.freeze
樣的作品。
開始對紅寶石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
這是正確的答案,恕我直言。 – 2013-03-08 16:37:09
這真是太棒了。我不知道這甚至是一件事情。 – 2013-07-16 16:18:55
直到http://www.ruby-doc.org/core-2.0.0/Module.html(http://www.ruby-doc.org/core)纔在「模塊」API中看到此方法-1.9.3/Module.html) – 2014-06-03 21:34:53
當然,所謂「私人」紅寶石並不意味着這是什麼意思在大多數語言。 Ruby在隱藏方面並不是那麼重要,所以如果你想訪問某些東西,你總是可以(但也許不會用最明顯的語法)。 Ruby的'private'只能說它不能在一個點之前('.')(我想這也是暗示它爲什麼不能在'::'上運行) – Amadan 2010-05-20 13:50:02
以防萬一。 Ruby 1.9.3現在有私有常量。 – whitequark 2011-08-03 13:32:49