ruby - NilClass、TrueClass 和 FalseClass 的用途是什么

标签 ruby language-design null

NilClassTrueClassFalseClass 各有一个实例,即niltruefalse,它们是常量,拥有这些类的目的是什么?为什么它们不能是 Object 类的实例,并且所有相关方法都简单地定义为 niltrue 上的单例方法错误?一个相关的问题是,为什么不将这些定义为常量?

最佳答案

它遵循“一切皆对象”和“对象由它们作为实例的类专门化”的思想。

niltruefalse 都是对象(因此是具有方法的类的实例化)。它们是 1) 各自类型的唯一居民并且是 2) 不可变对象(immutable对象)的强加允许实现优化 - 实际上,不是一个 够了吗?

一个有用的错误消息,没有专门针对值:x.class“just works”。

> > nil.foo
> => #<NoMethodError: undefined method `foo' for nil:NilClass>

我很高兴它说 NilClass :-)

这种类实例方法还使重新打开 NilClass(无论好坏)变得简单,并且与其他类型的处理方式一致。

至少从 Ruby 1.9.2 开始,不可能重新分配 truefalsenil(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 {|tru­e|}
> => #<SyntaxError: Can't change the value of true>

快乐编码。

关于ruby - NilClass、TrueClass 和 FalseClass 的用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025132/

相关文章:

ruby - bundler 的可执行文件 "bundle"与/usr/local/bin/bundle 冲突 覆盖可执行文件?

x86 - 进程内存中的 Unicode 字符串

java - 传递 null 时选择哪个构造函数?

null - 我应该同时使用 NotNull 和 ContractAnnotation ("null => halt")?

ruby-on-rails - 重定向到实例在 Ruby on Rails 中意味着什么

ruby - 在独立的 ruby​​ 应用程序中使用哪个 ruby​​ ORM 框架?

ruby - 从表示局部变量的字符串中获取值

c++ - C++ 中标识符名称的长度是否有限制?

c++ - C++ 中函数的关键字?

sql - 如何将所有记录的空白(null)值替换为 0?