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 either is currently nilに設定することである場合、実際に必要なのは次のとおりです。

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

上記のコードの間違いは、 to の値のみを設定する部分でした。a,b=0左側は 2 つの値を探しており、右側には 1 つだけが提供されているため、 to に設定されています (したがって、他の値は と見なされます) 。a0bnilnil

于 2010-02-24T09:59:39.957 に答える
3

並列代入 ( a, b = 0) の結果はa=0andb=nilになります。つまり、 と に代入され0ます。これは、右辺に値が 1 つしかないためです。anilb

あなたが望むのは: if a.nil? または b.nil?; a = b = 0; 終了 c = a + b

orが nil のときに and の非 nil 値を 0aで上書きするため、明らかにコードはまだ壊れています。bab

于 2010-02-24T10:06:33.113 に答える