2010-06-07 16 views
29

Seleccionar tiene sentido. Pero alguien puede explicarme. ¿Detectarme? No entiendo estos datos.Ruby Detect método

>> [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] 

Respuesta

65

Detectar devuelve el primer elemento de la lista para la que el bloque devuelve TRUE. Su primer ejemplo:

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

devoluciones 3 debido a que es el primer elemento de la lista que devuelve TRUE para la expresión x.between?(3,4).

detect deja de iterar después de que la condición devuelve verdadera por primera vez. select iterará hasta que se llegue al final de la lista de entrada y devuelva todos los elementos donde el bloque devolvió verdadero.

+2

obligatorio enlace RubyDoc: http://ruby-doc.org/ core/classes/Enumerable.html # M003123 –

+14

Un alias para 'detectar' es 'buscar'. Para mí es más fácil entender la semántica del método si lo pienso como 'encontrar'. – Florin

+2

Sin embargo, el uso de "detectar" y "buscar" de forma intercambiable no parece ser correcto. Si comprueba los documentos de Ruby, si es que señala tanto en el código de ejemplo de detección y descubrimiento que se comportan de manera diferente. De hecho, es difícil determinar la diferencia entre "encontrar" y "detectar" porque el texto explicativo es ~ exactamente ~ el mismo para ambos métodos, pero los métodos explicativos difieren. http://ruby-doc.org/core-2.2.1/Enumerable.html#method-i-find –

9

detectar simplemente devuelve el primer valor que satisface el predicado, si lo hay, nulo en caso contrario. select devuelve todos los valores que satisfacen el predicado. a.detect { p } es análoga a 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 
4

el rubí-docs son una gran ressource cuando se quiere aprender acerca de los métodos.

Enumerable#detect

1

encuentran & detectan siempre bien devolver un solo objeto o que volverán a cero si nada se compara.

p. [1,2,3,4,5,6,7] .detect {| x | x.between? (1,7)} => 1

find_all y select devolverá una matriz de cosas que encuentre que coincidan.

p. [1,2,3,4,5,6,7] .select {| x | ? X.between (1,7)} => [1, 2, 3, 4, 5, 6, 7]

Reference Link