【问题标题】:Why class comparison in case doesn't work? [duplicate]为什么类比较以防万一不起作用? [复制]
【发布时间】:2016-06-27 10:18:18
【问题描述】:

通常可以像这样比较两个类

x = "String"
puts "A string" if x.class == String

但是,当case这样使用时,

x = "String"
case x.class
  when String
    puts "A string"
end

它不起作用。为什么?

更新:

以下情况,

x = "String"
case x
  when String
    puts "A string"
end

它有效。是不是说case隐式地把类转换成字符串?

【问题讨论】:

  • 您在问xclass 是否是String。好吧,显然不是,它是Class。在第二个示例中,您要问x 是否是String,就是这样。

标签: ruby


【解决方案1】:

比较是通过使用=== 运算符将when 子句中的对象与case 子句中的对象进行比较来完成的。该运算符可按预期使用文字,但不适用于类。这意味着如果您想对对象的类执行case ... when,这将不起作用。

>> 1 === 1
=> true
>> 1.class === 1.class
=> false

this answer 中有一个很好的解释和一个关于在 Ruby 中 Class 实例上使用 === 的小展示

【讨论】:

  • 在这方面特别有趣:1.class === 1true
  • 那是因为=== 只是一个在实例上调用的方法,并且实例可以做任何它认为合适的事情。所以很明显,Fixnum 类在方法 === 中匹配它的值
【解决方案2】:

你必须删除 x 上的 .class 方法

x = "String"
case x
  when String
    puts "A string"
end

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 2021-11-10
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多