【发布时间】:2021-04-23 17:12:28
【问题描述】:
当我尝试在 case 语句中匹配字符串“3”时,如果范围达到“9”而不是“10”,则匹配。
我猜它与三等号运算符有关,但我不知道它可以在范围内但不匹配的确切原因。
这是一个 IRB 运行,记录了两种情况有效(使用“9”)和不有效(使用“10”):
case '3'
when ('0'...'9')
puts "number is valid"
else
puts "number is not valid"
end
输出:number is valid
case '3'
when ('0'...'10')
puts "number is valid"
else
puts "number is not valid"
end
输出:number is not valid
我用作预期结果参考的方法是 Enumerable#include? Enumerable#member?
并查看转换为数组时的输出是 (Enumerable#to_a)。
“大小写相等”(===) 运算符的结果让我吃惊。
puts ('0'...'10').include?('3')
# => true
puts ('0'...'10').member?('3')
# => true
puts ('0'...'10') === '3'
# => false
puts ('0'...'10').to_a
# => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
【问题讨论】:
-
TL;DR:字典顺序与字符串转换为数字顺序不同。
-
如果你的范围不是那么大,你可以使用
when *'0'...'10',它将你的范围变成一个参数列表,即when '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'。 -
@Stefan 实际上我最喜欢这个解决方案,因为我正在使用它。简明扼要,只要下一个人理解 splat 运算符的作用,以后应该会更容易阅读。我问了一个错误的问题来作为答案,但这是迄今为止我的问题的最佳解决方案。谢谢!
标签: ruby