繁体   English   中英

Ruby的用例为nil,相当于Python None或JavaScript undefined

[英]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。

nilfalse也是Ruby中唯一两个在逻辑上都是错误的值,因此在失败的情况下返回nil方法是习惯的。 有一个名为andand的宝石,它正好利用了这个,而不是像

@first_name &&= @first_name.trim

你可以写

@first_name.andand.trim

如果它具有除nil之外的值,则基本上转换为修剪@first_name ,否则计算为nil 可以想象,当链接其中一个中介可能返回nil方法时,这尤其有用。

除了在尝试访问不存在的集合元素时也返回nil ,例如在数组或散列的情况下。 未初始化的实例变量的值也为nil

我并不是精通Python,但是从我所看到的nilNone几乎完全相同的目的。

除了关于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM