Ruby中nil的用法,类似于Python的None或JavaScript的undefined
在Ruby中,nil
是怎么在代码中表现出来的呢?比如在Python里,如果你想给一个参数设置默认值,可以用None,尤其是当这个默认值是另一个参数的时候。但在Ruby中,你可以在参数列表中直接引用其他参数(可以参考这个问题)。而在JavaScript中,undefined
更常见,因为你根本不能设置默认参数。能不能给个例子,说明nil
是怎么出现的,以及我们是怎么处理它的?
我不是想要一个简单的nil
例子。最好是一个真实的代码片段,里面必须用到nil
,不管是什么原因。
5 个回答
在Ruby代码中,你经常会看到nil
的一个用法是这样的:
a ||= 10 # or a = a || 10
之所以这样工作,是因为一旦一个变量出现在赋值的左边,它就隐含地被赋值为nil
。
>> if false
.. x = y
.. z
.. end
=> nil
>> x
=> nil
>> z
NameError: undefined local variable or method `z' for main:Object
所以当a || 10
这一部分被计算时,它实际上是在计算nil || 10
,结果就是10。
在Ruby中,nil
和false
是唯一两个被认为是“假”的值,因此通常情况下,方法在失败时会返回nil
。有一个叫andand
的库正是利用了这一点,所以你可以用这样的方式替代:
@first_name &&= @first_name.trim
你可以写成:
@first_name.andand.trim
这基本上意味着,如果@first_name
有值(不是nil
),就对它进行修剪,否则返回nil
。你可以想象,这在链式调用方法时特别有用,因为其中一个中间结果可能会返回nil
。
此外,当你尝试访问不存在的集合元素时,比如数组或哈希表,nil
也会被返回。未初始化的实例变量也会被赋值为nil
。
我对Python不是很熟悉,但从我看到的情况来看,nil
和None
基本上是起到同样的作用。
除了关于nil的各种解释,Ruby还有一个叫做'defined?'的东西。
a = nil
p defined?(a) #=> "local-variable"
p a.nil? #=> true
p defined?(b) #=> nil
Ruby中的nil和Python中的None
是相同的,它们都表示没有值的状态。不过,从Python转到Ruby的人可能会对某些行为感到意外。首先,Ruby在一些情况下会返回nil
,而Python则会抛出异常:
访问数组和哈希:
[1, 2, 3][999] # nil. But [].fetch(0) raises an IndexError
{"a" => 1, "b" => 2}["nonexistent"] # nil. But {}.fetch("nonexistent") raises an IndexError
实例的实例变量:
class MyClass
def hello
@thisdoesnotexist
end
end
MyClass.new.hello #=> nil
第二个值得注意的事实是,nil
其实是一个对象,并且有很多方法可以使用。你甚至可以把它转换成整数、浮点数或字符串:
nil.to_i # 0
nil.to_f # 0.0 # But Integer(nil) or Float(nil) raise a TypeError.
nil.to_s # ""