2010-05-20 85 views
32

在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 
+1

當然,所謂「私人」紅寶石並不意味着這是什麼意思在大多數語言。 Ruby在隱藏方面並不是那麼重要,所以如果你想訪問某些東西,你總是可以(但也許不會用最明顯的語法)。 Ruby的'private'只能說它不能在一個點之前('.')(我想這也是暗示它爲什麼不能在'::'上運行) – Amadan 2010-05-20 13:50:02

+2

以防萬一。 Ruby 1.9.3現在有私有常量。 – whitequark 2011-08-03 13:32:49

回答

12

你也可以改變你的恆進一類方法:

def self.secret 
    'xxx' 
end 

private_class_method :secret 

這使得它的類的所有實例中訪問,而不是外界。

+0

也許有點元編程會讓這個更美味。 – DMisener 2010-05-25 15:20:46

+0

我想了一會兒,然後意識到上述方法並沒有使常量可用於實例方法,所以我認爲我會堅持@@ var方法。 – DMisener 2010-05-25 15:51:11

+0

@ DMisener:如果有人想要元編程魔術,Ruby有一個缺少常量的方法。 – 2011-04-11 23:08:45

9

取而代之的是一直不變的,可以使用@@ 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開始用,所以...

+0

謝謝......在事後看來似乎很明顯。 – DMisener 2010-05-25 15:22:50

1

嗯......

@@secret = 'xxx'.freeze 

樣的作品。

131

開始對紅寶石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 
+5

這是正確的答案,恕我直言。 – 2013-03-08 16:37:09

+1

這真是太棒了。我不知道這甚至是一件事情。 – 2013-07-16 16:18:55

+0

直到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

相關問題