允许重新定义Ruby常量并允许通过send()方法访问私有方法的基本原理?

时间:2013-03-07 14:15:21

标签: ruby constants private-methods

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

1 个答案:

答案 0 :(得分:3)

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

对于常数,嗯,你得到警告。你被告知你正在做一些你不应该做的事情。但Ruby是一种信任你的语言,你知道你在做什么。它不会妨碍你。如果你想用脚射击自己,你应该被允许这样做。或者,一种更为愤世嫉俗的方式来看待它:你可以在Ruby中做很多邪恶的事情,重新定义常量并不重要。