Environnement: Ruby 2.7.1
Manuel de référence:
Par exemple, envisagez de «rechercher un index égal à 1 dans un tableau composé uniquement de 0 et de 1 pour chaque élément et de traiter quelque chose». Si vous voulez juste le trouver, vous pouvez le faire avec each_with_index
etc., mais s'il s'agit d'un processus compliqué tel que la réécriture du tableau d'origine (qui peut affecter la recherche suivante), vous devez faire de votre mieux avec une instruction de boucle.
Dans le cas de Ruby, la position peut être spécifiée par ** Array # index
** sans boucler l'index. Cependant, cela a ses inconvénients: ** Il ne peut pas être recherché à partir de la suite de la dernière fois **.
seq = [1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1]
i = -1
while (i = seq.index(1, i + 1))
#Traitement complexe qui nécessite i
p i
end
#=> ArgumentError (wrong number of arguments (given 2, expected 0..1))
Mais ** cela peut être fait avec une chaîne **.
seq = [1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1].map(&:chr).join
i = -1
while (i = seq.index(1.chr, i + 1))
#Traitement complexe qui nécessite i
p i
end
#=> 0 2 4 5 6 7 11 14
La même chose s'applique à «# rindex», qui recherche dans l'ordre inverse.
Lors de la modification d'un tableau en chaîne de caractères et de la recherche avec # index
, il existe les fonctionnalités suivantes.
[^ scp]: Notez également la possibilité que les nombres d'une certaine plage ne puissent pas être convertis en caractères, comme dans le domaine des paires de substitution Unicode → 0xD800.chr ('UTF-8')