to_int: как разрешить принудительное использование TrueClass в Fixnum

#ruby

#ruby

Вопрос:

Я попытался расширить логические классы следующим образом:

 class TrueClass def to_i() 1 end end
class TrueClass def to_int() 1 end end

class FalseClass def to_i() 0 end end
class FalseClass def to_int() 0 end end
  

Но 1 * true все равно выдает true can't be coerced into Fixnum

Комментарии:

1. Отличная статья объясняет шаблон принуждения в Ruby Принуждение к классу в Ruby

Ответ №1:

Прочитайте статью в комментарии, tl; dr было бы:

 class TrueClass
  def to_i
    1
  end

  def coerce(other)
    [other, other.is_a?(Numeric) ? to_i : self]
  end
end

1 * true # => 1
  

Если вы хотите выполнять арифметику только с логическими значениями, вы можете удалить условное выражение, но это может иметь побочные эффекты.