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 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
class Person
def SECRET
'xxx'
end
def show_secret
puts SECRET
end
end
Person::SECRET # Error: No such constant
Person.SECRET # Error: No such method
Person.new.SECRET # Error: Call private method
person.new.show_secret # prints "xxx"
5条答案
按热度按时间i1icjdpr1#
从ruby 1.9.3开始,我们有了
Module#private_constant
方法,这似乎正是我们想要的:zvokhttg2#
也可以将常量更改为类方法:
这使得它可以在类的所有示例内访问,但不能在类的外部访问。
w7t8yxp53#
您可以使用@@class_variable来代替常量,它始终是私有的。
当然,ruby不会强制@@secret的恒定性,但是ruby一开始就很少强制恒定性,所以......
cgfeq70w4#
好吧...
挺管用的。
8yparm6h5#
你可以从字面上把它作为一个私有方法放在首位🤷🏼♂️