Did you know that you can navigate the posts by swiping left and right?

所有对象的值都可能为nil

2016-06-01 . 编程 . 评论
#Effective Ruby

  • 对象与类

    Ruby程序中的所有对象都源自于BasicObject

    结合《Ruby元编程》上的内容,得到如下图所示的一张关系图:

Ruby中的类

  • 对象为nil时

    在实战中,经常遇到这样的一个错误: NoMethodError: undefined method ‘’ for nil:NilClass

    这就是一个nil的对象去调用不属于NilClass的方法时出现的错误。

    一般使用以下几种方法来防止错误的出现:

    • 用nil?来判断对象是否为空
    • 用is_a?来判断对象是否是所期望的类型
    • 用respond_to?来判断当前对象是否可以调用这个方法
    • 用method_missing来表示捕捉并处理异常
    • 用&.来忽略错误(这个是Ruby2.3中加入的新特性)
    • 在Rails中,也可以使用try方法。使用上和 &. 基本相同
  • nil对象的转换

    由于所有的对象都源自于BasicObject,其他的对象是通过继承得到的,在这样的情况下,多态就不可避免地出现了。(这么说,似乎不是很合适。)两个不是同一个类的对象,有着相同的方法。比如,Object对象的to_s方法,就可以将对象转换为字符串;对于NilClass的对象来说,可以得到字符串;对于String对象来说,也可以得到其本身……

    对于nil对象的转换,我们一般使用以下方法来执行:

nil.to_s    #=> ""
nil.to_a    #=> []
nil.to_i    #=> 0
nil.to_f    #=> 0.0

如果nil对象存在于数组中,则可以使用compact方法删去数组中的nil对象。

arr = [1, nil, 2]	#=> [1, nil, 2]
arr.compact			#=> [1, 2]