3

这里发生了什么?

irb(main):001:0> a= nil
=> nil
irb(main):002:0> b = nil
=> nil
irb(main):003:0> a
=> nil
irb(main):004:0> a+b
NoMethodError: undefined method `+' for nil:NilClass
    from (irb):4
    from :0
irb(main):005:0> if a.nil? or b.nil?; a,b=0;end;
irb(main):006:0* c = a+b
TypeError: nil can't be coerced into Fixnum
    from (irb):6:in `+'
    from (irb):6
    from :0
irb(main):007:0>

如何通过将 nil 转换为数字来安全地执行算术运算?

4

3 回答 3

5

根据为什么有 nil 而不是数字,您可以决定将 nil 视为 0 对您有好处;在这种情况下,您可以执行以下操作:

c = (a || 0) + (b || 0)

当然,这只有在你知道为什么你有一个 nil 而不是一个数字时才有意义......

于 2010-02-24T10:04:55.910 回答
3

为什么要添加nil?它专门设计为表示缺少值的东西(注意:nilis NOT 0)。

如果您真正想要做的是将两个值都设置为0if any is current nil,那么您真正想要的是:

if a.nil? or b.nil?; a,b=0,0; end

您在上面的代码中的错误是该a,b=0部分,它仅将值设置a0- 它设置b为,nil因为左侧正在寻找两个值,而右侧只提供了一个值(因此假设其他值是nil)。

于 2010-02-24T09:59:39.957 回答
3

您的并行赋值 ( a, b = 0) 导致a=0and b=nil,即它分配0anilto b,因为右侧只有一个值。

你想要的是:如果a.nil?或 b.nil?a = b = 0; 结束 c = a + b

显然代码仍然被破坏,因为当or为 nil时,您用 0 覆盖aand的任何非 nil 值。bab

于 2010-02-24T10:06:33.113 回答