Ale*_*ski 3 ruby if-statement switch-statement
为什么if语句在下面的示例中起作用,而switch语句却没有.
工作:
if ''.class == String
puts "yep, that's a string"
end
Run Code Online (Sandbox Code Playgroud)不工作:
case ''.class
when String
puts "yep, that's a string, but this case is never triggered"
end
Run Code Online (Sandbox Code Playgroud)在上面的小例子,switch语句是矫枉过正,但也有明显的,其中一个switch语句会比干燥的情况链式elsif小号
Mat*_*ahé 11
实际上,ruby的"案例"与===进行了比较
所以你的例子相当于:
if ''.class === String
puts "yep, that's a string"
end
Run Code Online (Sandbox Code Playgroud)
快速简单的答案是案例使用===(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)
这是因为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对象是否属于该类.我写了一篇关于这个的文章,它解释了一下,你可以在这里阅读.
| 归档时间: |
|
| 查看次数: |
284 次 |
| 最近记录: |