[英]Ruby use case for nil, equivalent to Python None or JavaScript undefined
Ruby的nil
如何在代码中显示出来? 例如,在Python中,当引用另一个参数时,您可以使用None作为默认参数,但在Ruby中,您可以引用arg列表中的其他参数(请参阅此问题 )。 在JS中, undefined
弹出更多,因为您根本无法指定默认参数。 你能举例说明RubyNone
是如何弹出的以及它是如何处理的?
我不是只想找一个使用nil
的例子。 优选地,它将是真实的代码片段,由于某种原因或其他原因必须使用nil
。
Ruby的nil和Python的None
几乎相同(它们代表缺乏价值),但来自Python的人可能会发现令人惊讶的行为。 首先,在Python引发异常的情况下,Ruby返回nil
:
访问数组和哈希:
[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 # ""
不出所料,一些Python程序员倾向于不喜欢这种宽容行为(我最初做过),但是一旦你习惯它就可以了。
我不确定这会回答你的问题,只是我的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
评估a || 10
部分,评估为nil || 10
nil || 10
,产生10。
nil
和false
也是Ruby中唯一两个在逻辑上都是错误的值,因此在失败的情况下返回nil
方法是习惯的。 有一个名为andand
的宝石,它正好利用了这个,而不是像
@first_name &&= @first_name.trim
你可以写
@first_name.andand.trim
如果它具有除nil
之外的值,则基本上转换为修剪@first_name
,否则计算为nil
。 可以想象,当链接其中一个中介可能返回nil
方法时,这尤其有用。
除了在尝试访问不存在的集合元素时也返回nil
,例如在数组或散列的情况下。 未初始化的实例变量的值也为nil
。
我并不是精通Python,但是从我所看到的nil
和None
几乎完全相同的目的。
除了关于nil的所有解释之外,ruby还有'定义?'。
a = nil
p defined?(a) #=> "local-variable"
p a.nil? #=> true
p defined?(b) #=> nil
我的Ruby-fu很弱,但是nil
可能就是你想要的。 以下是在函数中使用nil
作为默认参数的快速说明。
irb(main):003:0> def foo(a = nil)
irb(main):004:1> puts a
irb(main):005:1> end
=> nil
irb(main):006:0> foo(1)
1
=> nil
irb(main):007:0> foo()
nil
=> nil
irb(main):008:0>
它们也用来代替void
:在静态语言中,编译器只会禁止你使用void
函数的返回值,但是在动态语言中,每个过程都必须返回一些东西 。 所以使用特殊值nil
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.