Итак, я писал функцию модуля для преобразования значений «ложь» и «истина» в истинное и ложное. Для этого я использовал выражение case, которое, насколько я могу судить, в основном представляет собой большой оператор elseif, в котором используется === функция с оператором === , являющимся предназначен для сравнения наборов . Из документации Ruby единственное различие, которое я действительно могу найти между == и === - это то, что === можно перезаписать для сравнения потомков классов. Я также понимаю, что все является вызовом метода в ruby ​​< / a>, поэтому мы не можем предполагать, что методы равенства / включения коммутативны.

При использовании оператора case для сортировки по классам я мог бы предположить, что функциональные возможности == и === будут идентичными, но я обнаружил, что при сортировке по классам оператор case никогда не помещает мои входные данные в правильную корзину. В этот момент я переключился на использование ==, и это сработало, поэтому мне было интересно, почему это так, поскольку я сравниваю классы, которые, как я предполагал, на самом деле будут сравнением «яблоки с яблоками».

module FirstTry
  def self.to_boolean(uncertain_value, to_integer: false)
    case uncertain_value.class
    when String
      value = ActiveRecord::Type::Boolean.new.cast(uncertain_value)
      return 1 if to_integer == true && value == true
      return 0 if to_integer == true && value == false
      return boolean_value
    when TrueClass
      return 1 if to_integer == true
      return true
    when FalseClass
      return 0 if to_integer == true
      return false
    when NilClass
      return 0 if to_integer == true
      return false
    end
    # I did not originally include this part of the code in the question
    raise 'Conversion Failed: No rules for converting that type of input into a boolean.'
  end
end

module SecondTry
  def self.to_boolean(uncertain_value, to_integer: false)
    if uncertain_value.class == String
      boolean_value = ActiveRecord::Type::Boolean.new.cast(uncertain_value)
      return 1 if to_integer == true && boolean_value == true
      return 0 if to_integer == true && boolean_value == false
      return boolean_value
    elsif uncertain_value.class == TrueClass
      return 1 if to_integer == true
      return true
    elsif uncertain_value.class == FalseClass
      return 0 if to_integer == true
      return false
    elsif uncertain_value.class == NilClass
      return 0 if to_integer == true
      return false
    end
    # I did not originally include this part of the code in the question
    raise 'Conversion Failed: No rules for converting that type of input into a boolean.'
  end
end
0
Mendoza 16 Янв 2018 в 01:02

1 ответ

Лучший ответ

Тройка равно === вызывается изнутри в выражении case в Ruby. Мы сочли удобным выразить что-то вроде:

case object
when String
  "object is an instance of String!"
when Enumerable
  "wow, object is actually a bunch of objects!"
end

Это, конечно, удобно, если вы на самом деле не владеете классом, а не его экземпляром. Но в вашем примере вы вызываете #class для объекта в своем выражении case. Просто откажитесь от этого звонка, и ваши дела будут отправлены в соответствующие корзины. :)

2
Martin Svalin 15 Янв 2018 в 22:10