NilClass
,TrueClass
和FalseClass
各有一个实例,即nil
,true
和false
,它们是常量,是什么有这些课程的目的是什么?为什么它们不能成为Object
类的实例,并且所有相关方法都被简单地定义为nil
,true
和false
上的单例方法?一个相关的问题是,为什么这些没有被定义为常数?
答案 0 :(得分:11)
它始终坚持“一切都是对象”的理念,“对象由它们所属的类专门化”。
nil
,true
和false
都是对象(因此是具有方法的类的实例化)。他们是1)相应类型的唯一居民并且2)不可变对象允许实现优化 - 并且实际上不是一个 {{1够了吗?
没有值专门化的有用错误消息:nil
“只是工作”。
x.class
我很高兴它说> > nil.foo
> => #<NoMethodError: undefined method `foo' for nil:NilClass>
: - )
这种类 - 实例方法也使重新开放NilClass
- 无论好坏 - 与其他类型的方式一样容易和一致。
至少从Ruby 1.9.2开始,无法重新分配NilClass
,true
或false
(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]
我不知道他们为什么不使用true
,false
或nil
执行此方法。也许是因为人们需要理解这些对象(按照pst的答案),而人们不需要理解“主要”(?)对象。