Ruby范围:在case语句中使用运算符

7

我想确认我的数字是否在某个范围内,包括更高的值。

在IF语句中,我可以简单地使用"x > 100 && x <= 500"

但是在Ruby的case(switch)语句中该怎么办呢?

使用:

case my_number
when my_number <= 500
    puts "correct"
end

无法运行。

注意:

标准范围不包括my_number恰好为500的情况,我不想添加第二个“when”,因为这样会导致重复内容。

case my_number
# between 100 and 500
when 100..500
    puts "Correct, do something"
when 500
    puts "Correct, do something again"
end

你错了。100..500 匹配 500 - sawa
4个回答

7

就像你说的那样,它应该可以正常工作。下面的case结构中包括值为500。

case my_number
# between 100 and 500
when 100..500
    puts "Correct, do something"
end

所以:
case 500
  when 100..500
    puts "Yep"
end

会返回Yep

或者,如果值正好为500,您想执行单独的操作吗?


它回答了我的问题,你说得对,我还是个新手 :) - davegson
不用担心,很高兴我能够确认你的答案 ;) - Christian-G
6
为了完整起见:1..500 包括 500,而 1...500 不包括 500。使用 .. 构建的范围从开头到结尾是包括结尾的。使用 ... 创建的范围不包括结尾值。 - Christian-G
@yossarian,你所提到的使用范围在case语句中是否可以用于日期范围?我想测试今天的日期是否在某些范围内,并根据日期范围的不同,将一个值赋给current_week。谢谢。 - jackerman09
这是一个时间范围:(Time.now..Time.now+10).cover?(Time.now),请参见:http://ruby-doc.org/core-2.0.0/Range.html。 - Christian-G

4
when -Float::INFINITY..0

能够解决问题 :)

1
你可以这样做:
(1..500).include? x

这也被称为成员吗?


1
这里有一种 case 方式来捕获所需的表达式 "x > 100 && x <= 500 :在闭区间中获取一个值,该区间的起始值被排除,而结束值被包含。同时展示了在此之前和之后捕获范围的方法。
case my_number
when ..100;         puts '≤100'
when   100..500;    puts '>100 and ≤500'
when        500..;  puts '>500'
end

说明:

  • 一个端点被省略的范围从 -Infinity 开始,或者到达 Infinity。这是 在 Ruby 2.6 中引入的
  • 范围 x..y 包括结束值,范围 x...y 排除结束值。
  • 所有范围都包括起始值。要创建没有起始值的范围的等效方法,可以在前面的 when 语句中捕获起始值。这就是第二个 when 语句如何等同于你的 "x > 100 && x <= 500 即使 (100..500).include? 100。第三种情况同理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接