当前位置: 首页 > 知识库问答 >
问题:

为什么字符串“3”在case语句中与范围(“0”…“10”)不匹配?

卫飞
2023-03-14

当我试图匹配一个case语句中的字符串“3”时,如果范围上升到“9”而不是“10”,它就匹配了。

我在猜测它和三重等于运算符有关系,但我不知道它能在范围内,却不匹配的确切原因。

下面是一个IRB运行,它记录了工作(使用'9')和不工作(使用'10')的两种情况:

 case '3'
 when ('0'...'9')
     puts "number is valid"
 else
   puts "number is not valid"
 end

输出:编号有效

 case '3'
 when ('0'...'10')
     puts "number is valid"
 else
   puts "number is not valid"
 end

输出:编号无效

我用作预期结果参考的方法是
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"]

共有1个答案

仲孙毅
2023-03-14

范围使用cover?进行大小写相等。因此,它是比较“3”>=“0”&“3”<“10”结果为false因为“3”<“10”#=>false。字符串根据字符值进行比较。

为了更好地理解,您可能希望将字符串视为字符数组:

['3'] <=> ['1', '0'] #=> 1 (first operand is larger than the second)

要解决此问题,请将大小写输入转换为整数并使用整数范围:

case 3 # or variable.to_i
when 0...10
  puts 'number is valid'
else
  puts 'number is invalid'
end

这是因为整数不是基于字符代码比较的,而是基于实际值比较的。3>=0&3<10结果为true

或者,您可以通过传递一个方法而不是一个范围,显式地告诉何时使用member?(或include?)方法。

case '3'
when ('0'...'10').method(:member?)
  puts 'number is valid'
else
  puts 'number is invalid'
end
 类似资料:
  • 我的理解是, 函数实际上是 Python 3 中的一种对象类型,它动态生成其内容,类似于生成器。 在这种情况下,我预计下一行将花费大量时间,因为为了确定1万亿()是否在范围内,必须生成1万亿值: 此外:似乎无论我添加多少个零,计算或多或少都需要相同的时间(基本上是瞬时的)。 我也尝试过类似的方法,但计算仍然几乎是即时的: 如果我尝试实现我自己的范围函数,结果就不太好了! 对象在引擎盖下做什么使它如

  • 问题内容: 此功能是否将在以后的Java版本中使用? 有人可以解释为什么我不能这样做吗,就像Java 语句起作用的技术方式一样? 问题答案: 带有案例的switch语句已在Java SE 7中实现,至少在首次提出要求后的 16年。没有提供延迟的明确原因,但可能与性能有关。 在JDK 7中实现 现在,该功能已 通过“脱糖”过程实现。在声明时使用常量的干净,高级语法在编译时扩展为遵循模式的更复杂的代码

  • 问题内容: 据我了解,该函数实际上是Python 3中的一种对象类型,它像生成器一样动态生成其内容。 在这种情况下,我本以为下一行会花费过多的时间,因为要确定1个四舍五入是否在范围内,必须生成一个四舍五入值: 此外:似乎无论我添加多少个零,计算多少都花费相同的时间(基本上是瞬时的)。 我也尝试过这样的事情,但是计算仍然是即时的: 如果我尝试实现自己的范围函数,结果将不是很好! 使物体如此之快的物体

  • 问题内容: 这是有效的,并返回JavaScript中的字符串 为什么?这是怎么回事 问题答案: 如果我们将其拆分,则混乱等于: 在JavaScript中,确实是这样。将某物转换为数字,在这种情况下,它将降为或(请参见下面的规范详细信息)。 因此,我们可以简化它(优先于): 因为意思是:从中获取第一个元素,所以确实: 返回内部数组()。由于引用,说错了,但是让我们调用内部数组以避免错误的表示法。 在

  • 问题内容: 我正在编写一个打开文本文件并检查注释的程序。然后,它解析注释以检查某些单词。 错误im出现在以下while循环中,该循环检查是否当前行以空格或除’/’以外的其他字符开头,如果那里存在非反斜杠字符,则while循环移至下一行并检查再次。一旦while循环满足其要求并中断程序崩溃,我将收到以下输出错误。 这是有问题的代码示例 谢谢你的帮助。我确定这是一个简单的错误,但我只是看不到它。 问题

  • 问题内容: 显然,它不是根据长度来比较它们,而是通过编码来比较它们。但是,我不知道它是如何工作的。我需要一些解释:-) 问题答案: 字符串按字典顺序进行比较。即逐个字符,直到它们不相等或没有要比较的字符为止。“11”的首字符小于“ 3”的首字符。 如果我们使用字母,则因为不小于,不小于,但是由于小于,小于。 您可以将字符串显式转换为数字: