这里发生了什么?
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转换为数字来安全地执行算术?
答案 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=0
和b=nil
,即它将0
分配给a
和nil
分配给{{} 1}},因为右边只有一个值。
你想要的是: 如果a.nil?还是b.nil?; a = b = 0;结束 c = a + b
显然代码仍然被破坏,因为当b
或a
为零时,您将b
和a
的任何非零值覆盖为0。