NilClass
、TrueClass
和FalseClass
各有一个实例,即nil
、true
和false
,它们是常量,拥有这些类的目的是什么?为什么它们不能是 Object
类的实例,并且所有相关方法都简单地定义为 nil
、true
和 上的单例方法错误
?一个相关的问题是,为什么不将这些定义为常量?
最佳答案
它遵循“一切皆对象”和“对象由它们作为实例的类专门化”的思想。
nil
、true
和 false
都是对象(因此是具有方法的类的实例化)。它们是 1) 各自类型的唯一居民并且是 2) 不可变对象(immutable对象)的强加允许实现优化 - 实际上,不是一个 零
够了吗?
一个有用的错误消息,没有专门针对值:x.class
“just works”。
> > nil.foo
> => #<NoMethodError: undefined method `foo' for nil:NilClass>
我很高兴它说 NilClass
:-)
这种类实例方法还使重新打开 NilClass
(无论好坏)变得简单,并且与其他类型的处理方式一致。
至少从 Ruby 1.9.2 开始,不可能重新分配 true
、false
或 nil
(Python 2.x允许重新分配 True/False,但在 Python 3.x 中不允许)。请注意,因为 true/false/nil
是不是 常量,所以它们可以被优化到 AST 中——或者实现使用的任何东西——作为“文字值”而无需常量外观-向上。
> > VERSION
> => "1.9.2"
> > true = false
> => #<SyntaxError: Can't change the value of true>
> > [].each {|true|}
> => #<SyntaxError: Can't change the value of true>
快乐编码。
关于ruby - NilClass、TrueClass 和 FalseClass 的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025132/