0

当我们尝试重新定义一个常量时,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 的常量和私有方法的问题/讨论,但我没有找到任何与这些背后的原因相关的内容。

4

1 回答 1

3

至于send,答案很简单:一旦你使用反射,所有的赌注都没有了。请注意,这与大多数其他语言没有什么不同,例如,您还可以使用反射规避 Java 中的访问限制。

对于常量,你确实会收到警告。你确实被告知你正在做一些你不应该做的事情。但是 Ruby 是一种相信你知道你在做什么的语言。它不会妨碍你。如果你想在脚上开枪,你应该被允许这样做。或者,用一种更愤世嫉俗的方式来看待它:在 Ruby 中有很多邪恶的事情可以做,重新定义常量真的没那么重要。

于 2013-03-07T14:39:26.650 回答