nil的Ruby用例,相当于Python None或JavaScript undefined
Ruby的nil的Ruby用例,相当于Python None或JavaScript undefined,javascript,python,ruby,null,Javascript,Python,Ruby,Null,Ruby的nil如何在代码中体现?例如,在Python中,当默认参数引用另一个参数时,可以使用None作为默认参数,但在Ruby中,可以引用arg列表中的其他参数(请参阅)。在JS中,undefined会弹出更多,因为您根本无法指定默认参数。你能举一个例子说明如何弹出RubyNone以及如何处理它吗 我不是在寻找一个使用nil的示例。最好是一个真正的代码片段,出于某种原因必须使用nil。我的Ruby fu非常弱,但是nil可能就是你想要的。下面是在函数中使用nil作为默认参数的快速示例 irb(
nil
如何在代码中体现?例如,在Python中,当默认参数引用另一个参数时,可以使用None作为默认参数,但在Ruby中,可以引用arg列表中的其他参数(请参阅)。在JS中,undefined
会弹出更多,因为您根本无法指定默认参数。你能举一个例子说明如何弹出RubyNone
以及如何处理它吗
我不是在寻找一个使用
nil
的示例。最好是一个真正的代码片段,出于某种原因必须使用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>
Ruby和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
部分时,它的计算结果为nil | | 10
,这将产生10
nil
和false
也是Ruby中仅有的两个逻辑上为false的值,因此通常方法在失败时返回nil
。有一个名为和的gem正好利用了这一点,所以不是像这样的东西
@first_name &&= @first_name.trim
你可以写
@first_name.andand.trim
如果它的值不是nil
,则基本上转换为trim@first\u name
,否则计算为nil
。正如您所想象的那样,当链接其中一个中介可能返回nil
的方法时,这尤其有用
此外,当您试图访问不存在的集合元素时(例如在数组或哈希的情况下),也会返回nil
。未初始化的实例变量也具有值nil
我对Python不太精通,但从我所看到的nil
和None
的用途基本相同 它们也被用来代替void
:在静态语言中,编译器将简单地禁止您使用void
函数的返回值,但在动态语言中,每个过程都必须返回某些内容。因此使用了特殊值nil
。除了所有关于nil的解释之外,ruby还具有“defined?”
a = nil
p defined?(a) #=> "local-variable"
p a.nil? #=> true
p defined?(b) #=> nil
@德尔南:就是那个。我在Ruby中寻找的更多的是用例,而不是变量名,因此我编辑了这个问题,以反映实例变量示例中的@
是什么意思?实例变量名以@
开头,类变量以@
@x等同于Python中的self.x(虽然Ruby和Python中的OOP模式非常不同)。如果您执行[1,2,3]。取而代之的是fetch(999)
,您将得到一个异常。如果您打开了警告,您将得到一个关于MyClass.new.hello
的警告。如果您执行Integer(nil)
或Float(nil)
,您将得到TypeError
s.String(nil)
给了你一个空字符串。另外,你是说“允许”(允许很多事情),而不是“滥交”(做爱或与很多事情互动)?@Andrew:我会把你的笔记合并到答案中,谢谢。我以为“滥交”可以用作比喻……我会改变它。现在是“and”弹出窗口,我必须推荐ick项目(同一作者),它是“可能”模式,真的很好!这可能是nil或字符串。maybe.strip#string stripped或niland
和maybe
让我想起Haskell中的maybe
单子。@Claudiu:不要与lolcode中的mebbe
关键字混淆。如果你想知道,可能会有一个动态语言抛出异常使用一个没有返回任何内容的函数的结果。我只是不认为有人会这样做。不要被上面输出中的=>nil
搞糊涂:这是irb,显示foo
方法的返回值。