Sélectionnez est logique. Mais quelqu'un peut-il m'expliquer .détecter? Je ne comprends pas ces données.
>> [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]
Détecter renvoie le premier élément de la liste pour lequel le bloc renvoie VRAI. Votre premier exemple:
>> [1,2,3,4,5,6,7].detect { |x| x.between?(3,4) }
=> 3
Renvoie 3
Car il s'agit du premier élément de la liste qui renvoie VRAI pour l'expression x.between?(3,4)
.
detect
arrête l'itération après que la condition retourne true pour la première fois. select
itérera jusqu'à ce que la fin de la liste d'entrée soit atteinte et retourne tous les éléments où le bloc a renvoyé true.
detect retourne juste la première valeur qui satisfait le prédicat, le cas échéant, nil sinon. select
renvoie toutes les valeurs qui satisfont le prédicat. a.detect { p }
est analogue à 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
Les Ruby-docs sont une excellente ressource lorsque vous souhaitez en savoir plus sur les méthodes.
find
et detect
renverra toujours un seul objet ou renverra nil
si rien ne correspond:
[1,2,3,4,5,6,7].detect { |x| x.between?(1,7) }
=> 1
find_all
et select
renverra un tableau de choses qu'il trouvera qui correspondent:
[1,2,3,4,5,6,7].select { |x| x.between?(1,7) }
=> [1, 2, 3, 4, 5, 6, 7]