当我们尝试重新定义常量时,Ruby只显示警告,但不显示任何错误。那么人们总能在Ruby中重新定义一个常量吗?
也可以使用send方法调用类的私有方法:
Const = 12
puts Const
#only an warning: already initialized constant Const
Const = 14
puts Const #Displays 14
class MyClass
private
def priv
puts 'In private method'
end
end
obj = MyClass.new
#Error: private method `priv' called for #<MyClass:0x7f2cfda21738> (NoMethodError)
#obj.priv
#but this is fine!
obj.send(:priv)
Ruby中的这些设计背后有什么理由吗?这些不是分别违反常量和访问说明符的基本思想吗?
这些设计是否真的有实际用途?如果有的话,一些例子会很棒!
注意:我确实在这里看到很多关于Ruby的常量和私有方法的问题/讨论,但我没有发现与这些背后的原因相关的任何内容。
答案 0 :(得分:3)
至于send
,答案很简单:一旦你使用反射,所有的赌注都会被取消。请注意,这与大多数其他语言没有什么不同,例如,您也可以使用反射来规避Java中的访问限制。
对于常数,嗯,你做得到警告。你做被告知你正在做一些你不应该做的事情。但Ruby是一种信任你的语言,你知道你在做什么。它不会妨碍你。如果你想用脚射击自己,你应该被允许这样做。或者,一种更为愤世嫉俗的方式来看待它:你可以在Ruby中做很多邪恶的事情,重新定义常量并不重要。