De la documentation pour String#count
Je comprends le premier exemple, mais je ne comprends pas le reste des exemples:
a = "hello world"
a.count "lo" #=> 5
a.count "lo", "o" #=> 2
a.count "hello", "^l" #=> 4
a.count "ej-m" #=> 4
Toute explication sera utile.
C'est l'une des méthodes les plus stupides Ruby, et une documentation assez moche pour démarrer. J'ai jeté un coup d'œil. J'ai fini par le regarder parce qu'il semblait qu'il devrait me donner le nombre d'occurrences de une chaîne donnée. Non. Pas à distance. Mais voici comment j'ai fini par compter les occurrences de chaîne:
s="this is a string with is thrice"
s.scan(/is/).count # => 3
Je me demande pourquoi quelqu'un a demandé cette méthode et pourquoi la documentation est si moche. Presque comme la personne qui documentait le code n'avait vraiment aucune idée de la raison "commerciale" compréhensible par l'homme pour demander cette fonctionnalité.
count([other_str]+) → fixnum
Chaque paramètre _other_str_ définit un ensemble de caractères à compter. L'intersection de ces ensembles définit les caractères à compter dans str. Tout _other_str_ commençant par un caret (
^
) Est annulé. La séquencec1–c2
Signifie tous les caractères entrec1
Etc2
.
Si vous passez plus de 1 paramètre à compter, il utilisera l'intersection de ces chaînes et l'utilisera comme cible de recherche:
a = "hello world"
a.count "lo" #=> finds 5 instances of either "l" or "o"
a.count "lo", "o" #=> the intersection of "lo" and "o" is "o", so it finds 2 instances
a.count "hello", "^l" #=> the intersection of "hello" and "everything that is not "l" finds 4 instances of either "h", "e" or "o"
a.count "ej-m" #=> finds 4 instances of "e", "j", "k", "l" or "m" (the "j-m" part)
Chaque argument définit un ensemble de caractères. intersection de ces ensembles détermine l'ensemble global que count
utilise pour calculer un décompte.
a = "hello world"
a.count "lo" # l o => 5
a.count "lo", "o" # o => 2
Et ^
peut être utilisé pour la négation (toutes les lettres dans hello
, sauf l
)
a.count "hello", "^l" # h e o => 4
Les plages peuvent être définies avec -
:
a.count "ej-m" # e j k l m => 4
Décomposons-les
a = "hello world"
pour compter le nombre d'occurrences des lettres l
et o
a.count "lo" #=> 5
pour trouver l'intersection de lo
et o
(qui compte le nombre d'occurrences de l
et o
et ne prend que le nombre de o
des occurrences):
a.count "lo", "o" #=> 2
pour compter le nombre d'occurrences de h
, e
, l
, l
et o
, puis croisez celles qui ne sont pas l
(qui produit le même résultat que la recherche d'occurrences de h
, e
et o
)
a.count "hello", "^l" #=> 4
pour compter le nombre d'occurrences de e
et toute lettre entre j
et m
(j
, k
, l
et m
):
a.count "ej-m" #=> 4
Utiliser gsub dans la chaîne
a = "hello world hello hello hello hello world world world"
2.1.5 :195 > a.gsub('hello').count
=> 5
Je vais essayer:
Deuxième exemple: en utilisant la formulation "L'intersection de ces ensembles définit les caractères à compter dans str" les paramètres sont "lo" et "o". L'intersection de ces derniers est juste "o" dont il y a 2 dans la chaîne sur laquelle on compte. D'où la valeur de retour de 2.
Troisième exemple: celui-ci semble dire: "N'importe lequel des caractères de 'bonjour' mais pas le caractère 'l'". Obtenir cela à partir de la ligne "Tout autrestr qui commence par un caret (^) est annulé". Donc, vous pouvez compter l'ensemble des lettres contenues dans la chaîne "bonjour" qui se trouvent dans "bonjour le monde" (c'est-à-dire, h, e, l, l, o, o, l) mais en comparant ensuite l'intersection avec l'ensemble de "^l"
(c'est-à-dire h, e, o, w, o, r, d) vous vous retrouvez avec 4 (c'est-à-dire h, e, o, o).
Quatrième exemple: celui-ci dit en gros "compte tous les caractères" e "et tout caractère entre" j "et" m ". Il y a un" e "et 3 caractères contenus entre" j "et" m "et les 3 arrivent à être la lettre "l" qui nous laisse avec une réponse de 4 à nouveau.