принуждая ноль в число - PullRequest
       10

принуждая ноль в число

3 голосов
/ 24 февраля 2010

Что здесь происходит ??

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>

Как вы можете безопасно выполнять арифметику, преобразовывая ноль в число?

Ответы [ 3 ]

5 голосов
/ 24 февраля 2010

В зависимости от того, почему вместо числа стоит ноль, вы можете решить, что для вас полезно считать ноль 0; в этом случае вы можете сделать что-то вроде:

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

Это, конечно, имеет смысл, только если вы знаете , почему у вас ноль вместо числа ...

3 голосов
/ 24 февраля 2010

Ваше параллельное назначение (a, b = 0) приводит к a=0 и b=nil, т. Е. Оно присваивает 0 к a и nil к b, потому что в правой руке есть только одно значение сторона.

То, что вы хотите, это: если нет. или б.ниль ?; а = б = 0; конец с = а + б

Очевидно, что код все еще не работает, поскольку вы перезаписываете любые значения, отличные от nil, a и b с 0, когда a или b равно nil.

3 голосов
/ 24 февраля 2010

Почему вы хотите добавить nil? Он специально разработан для обозначения отсутствия значения (примечание: nil НЕ 0).

Если то, что вы на самом деле хотите сделать, это установить оба значения на 0, если либо в данный момент nil, то на самом деле вам нужно:

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

Ваша ошибка в приведенном выше коде была частью a,b=0, которая устанавливает значение a на 0 - она ​​устанавливает b на nil, потому что левая сторона ищет два значения, и только один указан справа (поэтому предполагается, что остальные nil).

...