为什么switch语句执行与if语句不同的相等性测试?

Ale*_*ski 3 ruby if-statement switch-statement

为什么if语句在下面的示例中起作用,而switch语句却没有.

在上面的小例子,switch语句是矫枉过正,但也有明显的,其中一个switch语句会比干燥的情况链式elsif小号

Mat*_*ahé 11

实际上,ruby的"案例"与===进行了比较

所以你的例子相当于:

if ''.class === String
   puts "yep, that's a string"
end
Run Code Online (Sandbox Code Playgroud)

  • 实际上,它将是`String ===''.class`.它在这种情况下没有区别,因为它们都是Class实例,但在其他情况下也是如此. (3认同)

iai*_*ain 5

快速简单的答案是案例使用===(3等于)而不是2.

$ irb                                                                 
if ''.class == String
  puts "yep, that's a string"   
end 
Run Code Online (Sandbox Code Playgroud)

是的,这是一个字符串

=> nil

if ''.class === String
  puts "yep, that's a string"
end
=> nil
Run Code Online (Sandbox Code Playgroud)


Abo*_*uby 5

这是因为case语句不使用==运算符,它使用===运算符(有时称为大小写相等运算符).这取决于操作员左侧的内容.所以,如果你要像这样转换case语句:

case "Some string"
when String
  puts "It's a string!"
else
  puts "It's not a string!"
end
Run Code Online (Sandbox Code Playgroud)

进入if语句,它将成为:

if String === "Some string"
  puts "It's a string!"
else
  puts "It's not a string!"
end
Run Code Online (Sandbox Code Playgroud)

请注意,Ruby会根据您的期望向后执行此操作String === "Some string".这是因为你真正想做的就是Class#===在这里打电话,而不是String#===.===运算符对任何对象的作用都取决于类.在这种情况下Class#===,它大致相当于呼叫"Some string".is_a?(String).但是,如果你这样做"a" === "b",String#===方法大致相当于String#==.

可能会让人感到困惑,但运营商的使用很大程度上是惯用的.换句话说,"when语句中的类对象"惯用语意味着测试case对象是否属于该类.我写了一篇关于这个的文章,它解释了一下,你可以在这里阅读.