Ruby中nil的用法,类似于Python的None或JavaScript的undefined

6 投票
5 回答
7490 浏览
提问于 2025-04-16 05:09

在Ruby中,nil是怎么在代码中表现出来的呢?比如在Python里,如果你想给一个参数设置默认值,可以用None,尤其是当这个默认值是另一个参数的时候。但在Ruby中,你可以在参数列表中直接引用其他参数(可以参考这个问题)。而在JavaScript中,undefined更常见,因为你根本不能设置默认参数。能不能给个例子,说明nil是怎么出现的,以及我们是怎么处理它的?

我不是想要一个简单的nil例子。最好是一个真实的代码片段,里面必须用到nil,不管是什么原因。

5 个回答

2

在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中,nilfalse是唯一两个被认为是“假”的值,因此通常情况下,方法在失败时会返回nil。有一个叫andand的库正是利用了这一点,所以你可以用这样的方式替代:

@first_name &&= @first_name.trim

你可以写成:

@first_name.andand.trim

这基本上意味着,如果@first_name有值(不是nil),就对它进行修剪,否则返回nil。你可以想象,这在链式调用方法时特别有用,因为其中一个中间结果可能会返回nil

此外,当你尝试访问不存在的集合元素时,比如数组或哈希表,nil也会被返回。未初始化的实例变量也会被赋值为nil

我对Python不是很熟悉,但从我看到的情况来看,nilNone基本上是起到同样的作用。

2

除了关于nil的各种解释,Ruby还有一个叫做'defined?'的东西。

a = nil

p defined?(a)  #=> "local-variable"
p a.nil?       #=> true
p defined?(b)  #=> nil
9

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 # ""

撰写回答