Ruby方法相当于python中的"if a in a list"?

noo*_*omz 17 ruby python syntax

在python中我可以使用它来检查列表中的元素是否a:

>>> a = range(10)
>>> 5 in a
True
>>> 16 in a
False
Run Code Online (Sandbox Code Playgroud)

如何在Ruby中完成这项工作?

pie*_*fou 26

使用include?()方法:

(1..10).include?(5) #=>true
(1..10).include?(16) #=>false
Run Code Online (Sandbox Code Playgroud)

编辑: (1..10)是Ruby中的Range,如果你想要一个数组(列表):

(1..10).to_a #=> [1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

  • 索引仅适用于Array但不适用于Range.!(1..10).to_a.index(5).nil?等于(1..10).包括?(5).显然,后者更好. (2认同)

joh*_*nes 10

Range具有===方法,该方法检查参数是否是范围的一部分.

你这样使用它:

(1..10) === 5  #=> true
(1..10) === 15 #=> false
Run Code Online (Sandbox Code Playgroud)

或者你写的时候:

a= (1..10)
a === 5  #=> true
a === 16 #=> false
Run Code Online (Sandbox Code Playgroud)

您必须确保您测试的范围和值的值是兼容类型,否则将抛出异常.

(2.718..3.141) === 3 #=> true
(23..42) === "foo"   # raises exception
Run Code Online (Sandbox Code Playgroud)
  • 这在O(1)中完成,因为Range#===(value)仅将值与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
Run Code Online (Sandbox Code Playgroud)