代码之家  ›  专栏  ›  技术社区  ›  eastafri

将nil强制为数字

  •  3
  • eastafri  · 技术社区  · 15 年前

    这里发生了什么??

    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 回复  |  直到 15 年前
        1
  •  3
  •   Amber    15 年前

    你为什么要加 nil ?它被专门设计成表示缺少值的东西(注意: 不是 0 )

    如果您真正想要做的是将两个值都设置为 0 如果两者都是 目前 ,那么你真正想要的是:

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

    你在上述代码中的错误是 a,b=0 部分,仅设置 a -集 b 因为左侧寻找两个值,而右侧只提供了一个值(因此假设其他值为 )

        2
  •  5
  •   giorgian    15 年前

    根据为什么会有一个零而不是一个数字,你可以决定把零视为0是件好事;在这种情况下,你可以做如下的事情:

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

    当然,只有当你 知道 为什么你用零代替数字…

        3
  •  3
  •   liwp    15 年前

    你的平行作业( a, b = 0 )结果 a=0 b=nil ,即分配 0 a nil b ,因为右侧只有一个值。

    你想要的是: 如果是零?还是B.NIL?;a=b=0;结束 C+A+B

    显然,代码仍然被破坏,因为您覆盖了 使用0时 是零。