将nil强制转换为数字

时间:2010-02-24 09:57:33

标签: ruby coercion

这里发生了什么?

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转换为数字来安全地执行算术?

3 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

为什么要添加nil?它专门设计为代表缺乏价值的东西(注意:nil不是0)。

如果你想要做的事情是将两个值都设置为0,如果当前是 nil,那么你真正想要的是:

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

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

答案 2 :(得分:3)

您的并行作业(a, b = 0)会产生a=0b=nil,即它将0分配给anil分配给{{} 1}},因为右边只有一个值。

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

显然代码仍然被破坏,因为当ba为零时,您将ba的任何非零值覆盖为0。