Ruby Detect方法

JZ.*_*JZ. 34 ruby detect

选择有意义.但有人可以解释.对我有所帮助吗?我不明白这些数据.

>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,4) }
=> 3
>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,6) }
=> 3
>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,7) }
=> 3
>> [1,2,3,4,5,6,7].detect { |x| x.between?(2,7) }
=> 2
>> [1,2,3,4,5,6,7].detect { |x| x.between?(1,7) }
=> 1
>> [1,2,3,4,5,6,7].detect { |x| x.between?(6,7) }
=> 6
>> [1,2,3,4,5,6,7].select { |x| x.between?(6,7) }
=> [6, 7]
>> [1,2,3,4,5,6,7].select { |x| x.between?(1,7) }
=> [1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

rye*_*guy 75

Detect返回列表中块返回TRUE的第一项.你的第一个例子:

>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,4) }
=> 3
Run Code Online (Sandbox Code Playgroud)

返回,3因为这是列表中第一个为表达式返回TRUE的项x.between?(3,4).

detect在条件第一次返回true后停止迭代.select将迭代直到到达输入列表的末尾并返回块返回true的所有项目.

  • 'detect'的别名是'find'.对我来说,如果我把它想象为'find',那么理解该方法的语义会更容易. (22认同)
  • @PaulDacus RubyDocs中`detect`和`find`的解释方法表现不同,因为它们被不同的对象调用:`(1..10)`vs`(1..100)`. (5认同)
  • 强制性的RubyDoc链接:http://ruby-doc.org/core/classes/Enumerable.html#M003123 (3认同)
  • 然而,可互换地使用"检测"和"发现"似乎不正确.如果你检查ruby文档,如果它在detect&find示例代码中指出它们的行为不同.实际上很难弄清楚"查找"和"检测"之间的区别,因为两种方法的解释性文本完全相同,但解释方法不同.http://ruby-doc.org/core-2.2.1/Enumerable.html#method-i-find (2认同)
  • @PaulDacus但是当你花费源代码时,#debug会指向enum_find(...).所以我认为#detect是#find的别名. (2认同)

Log*_*ldo 9

detect只返回满足谓词的第一个值,如果有的话,否则返回nil.select返回满足谓词的所有值.a.detect { p }类似于a.select { p }[0]

 irb(main):001:0> [1,2,3].detect { true }
 => 1
 irb(main):002:0> [1,2,3].detect { false }
 => nil
 irb(main):003:0> [1,2,3].detect { |x| x % 2 == 0 }
 => 2
Run Code Online (Sandbox Code Playgroud)


Pra*_*ran 5

当您想要了解这些方法时,ruby-docs是一个很好的资源.

枚举#检测