比较case语句和if语句中的类时出现意外结果

时间:2018-01-15 22:02:45

标签: ruby-on-rails ruby equality

所以我正在编写一个模块函数来转换' falsey'和' truthy'价值分为真和假。要做到这一点,我使用的是一个案例表达式,据我所知,它基本上只是a big elseif statement that uses the === function和===运算符being meant to be used for comparing sets。从Ruby documentation我可以在==和===之间找到的唯一区别是===可以被覆盖以比较类的后代。我也理解everything is a method call in ruby所以我们不能假设相等/包含方法是可交换的。

当使用case语句按类排序时我会猜到==和===的功能是相同的,但我发现当按类排序时,它们的case语句永远不会将我的输入放入正确的& #39;箱&#39 ;.那时我转而使用==它确实有效,所以我想知道为什么会这样,因为我正在比较我认为实际上是"苹果到苹果"比较。

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

1 个答案:

答案 0 :(得分:2)

三等于display: none在Ruby的===表达式中被调用。我们发现能够表达以下内容很方便:

case

当然,这很方便,除非您实际上持有该类,而不是该类的实例。但是在您的示例中,您在case表达式中的对象上调用case object when String "object is an instance of String!" when Enumerable "wow, object is actually a bunch of objects!" end 。只需取消该通话,您的案件就会被放入正确的箱子中。 :)