Ruby中相当于Python中“if a in list”的方法?
在Python中,我可以用这个方法来检查列表a
中是否有某个元素:
>>> a = range(10)
>>> 5 in a
True
>>> 16 in a
False
那在Ruby中怎么做呢?
2 个回答
10
Range有一个叫做===的方法,它用来检查某个值是否在这个范围内。
你可以这样使用它:
(1..10) === 5 #=> true
(1..10) === 15 #=> false
或者像你写的那样:
a= (1..10)
a === 5 #=> true
a === 16 #=> false
你需要确保范围的值和你要测试的值是相同类型的,否则会出现错误。
(2.718..3.141) === 3 #=> true
(23..42) === "foo" # raises exception
- 这个检查的速度是O(1),因为Range#===只需要把值和范围的第一个值(Range#first)和最后一个值(Range#last)进行比较。
- 如果你先调用Range#to_a,然后再用Array#include?,速度会变成O(n),因为Range#to_a需要把范围里的所有元素放到一个数组里,这个过程需要n的时间,而Array#include?又要在这个n个元素中查找一次。
如果你想看看这个区别,可以打开irb,然后输入:
(1..10**9) === 5 #=> true
(1..10**9).to_a.include?(5) # wait some time until your computer is out of ram and freezess
27
使用 include?()
方法:
(1..10).include?(5) #=>true
(1..10).include?(16) #=>false
编辑:(1..10)
在 Ruby 中是一个 范围,如果你想要一个数组(列表):
(1..10).to_a #=> [1,2,3,4,5,6,7,8,9,10]