NilClass,TrueClass和FalseClass的目的是什么?

时间:2011-11-06 03:53:00

标签: ruby language-design null

NilClassTrueClassFalseClass各有一个实例,即niltruefalse,它们是常量,是什么有这些课程的目的是什么?为什么它们不能成为Object类的实例,并且所有相关方法都被简单地定义为niltruefalse上的单例方法?一个相关的问题是,为什么这些没有被定义为常数?

2 个答案:

答案 0 :(得分:11)

它始终坚持“一切都是对象”的理念,“对象由它们所属的类专门化”。

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

没有值专门化的有用错误消息:nil“只是工作”。

x.class

我很高兴它说> > nil.foo > => #<NoMethodError: undefined method `foo' for nil:NilClass> : - )

这种类 - 实例方法也使重新开放NilClass - 无论好坏 - 与其他类型的方式一样容易和一致。

至少从Ruby 1.9.2开始,无法重新分配NilClasstruefalse(Python 2.x允许重新分配True / False,但不是在Python 3.x中。请注意,因为nil 不是常量,所以它们可以优化为AST - 或者无论实现使用什么 - 作为“文字值”而不进行常量查找。

true/false/nil

快乐的编码。

答案 1 :(得分:1)

Ruby在某些时候采用“只是取一个对象并向它添加一些单例方法”的方法:

C:\Documents and Settings\a.grimm>irb
irb(main):001:0> self.methods - Object.new.methods

给出

  

[:public,:private,:include,:context,:conf,:irb_quit,:exit,   :quit,:irb_print_working_workspace,:irb_cwws,:irb_pwws,:cwws,   :pwws,:irb_current_working_binding,:irb_print_working_binding,   :irb_cwb,:irb_pwb,:irb_chws,:irb_cws,:chws,:cws,   :irb_change_binding,:irb_cb,:cb,:workspaces,:irb_bindings,   :bindings,:irb_pushws,:pushws,:irb_push_binding,:irb_pushb,   :pushb,:irb_popws,:popws,:irb_pop_binding,:irb_popb,:popb,   :source,:jobs,:fg,:kill,:help,:irb_exit,:irb_context,   :install_alias_method,:irb_current_working_workspace,   :irb_change_workspace,:irb_workspaces,:irb_push_workspace,   :irb_pop_workspace,:irb_load,:irb_require,:irb_source,:irb,   :irb_jobs,:irb_fg,:irb_kill,:irb_help]

我不知道他们为什么不使用truefalsenil执行此方法。也许是因为人们需要理解这些对象(按照pst的答案),而人们不需要理解“主要”(?)对象。