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

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(

Ruby的
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或nil
and
maybe
让我想起Haskell中的
maybe
单子。@Claudiu:不要与lolcode中的
mebbe
关键字混淆。如果你想知道,可能会有一个动态语言抛出异常使用一个没有返回任何内容的函数的结果。我只是不认为有人会这样做。不要被上面输出中的
=>nil
搞糊涂:这是irb,显示
foo
方法的返回值。