【问题标题】:Classes in case statementscase 语句中的类
【发布时间】:2012-03-05 01:35:03
【问题描述】:

我无法确定这两个函数的行为为何不同。我可以只使用符号或我自己的常量,但我非常想知道这里发生了什么(以及我是否在做坏事)。

def convert(value, type)
    case type
    when Integer
        value.to_i
    when String
        value.to_s
    else
        value
    end
end

def convert_with_if(value, type)
    if (type == Integer)
        value.to_i
    elsif (type == String)
        value.to_s
    else
        value
    end
end

n = 4.4
p convert(n, Integer)  #=> 4.4
p convert_with_if(n, Integer) #=> 4

【问题讨论】:

    标签: ruby class if-statement switch-statement


    【解决方案1】:

    case 调用 ===,大小写相等运算符。 Module#=== 和扩展 Class#===,实际上测试给定参数的类是接收者还是它的后代之一。 String === object 实际上等同于 object.kind_of? String

    convert 1, String
    

    相当于:

    case String
      when Integer
        1.to_i
      when String
        1.to_s
    end
    

    这就像问is the String class an Integer?is the String class a String?。这两个问题的答案都是No, it is a Class.

    在代码方面,String.class 返回Class,它与Integer 甚至String 本身没有任何关系。如果你引入了when Classwhen Module 子句,它每次都会被执行。

    【讨论】:

      【解决方案2】:

      在您的 convert 函数中,您将获得 Integer 类型,即 Class。这就是为什么它与您的预期不同。

      【讨论】:

        【解决方案3】:

        convert 方法不匹配任何内容并默认为 else,这就是您获得 4.4 的原因。

        另外,如果您希望该方法输出4.4,那么您需要使用十进制而不是整数。

        【讨论】:

          猜你喜欢
          • 2018-12-25
          • 2023-04-07
          • 1970-01-01
          • 2016-08-22
          • 2013-09-24
          • 2021-04-02
          • 2014-12-05
          • 1970-01-01
          • 2011-04-23
          相关资源
          最近更新 更多