String#count options
Solution 1:
This is one of the dorkiest ruby methods, and pretty lousy documentation to boot. Threw me for a loop. I ended up looking at it because it looked like it should give me the count of occurrences of a given string. Nope. Not remotely close. But here is how I ended up counting string occurrences:
s="this is a string with is thrice"
s.scan(/is/).count # => 3
Makes me wonder why someone asked for this method, and why the documentation is so lousy. Almost like the person documenting the code really did not have a clue as to the human-understandable "business" reason for asking for this feature.
count([other_str]+) → fixnum
Each _other_str_ parameter defines a set of characters to count. The intersection of these sets defines the characters to count in str. Any _other_str_ that starts with a caret (
^
) is negated. The sequencec1–c2
means all characters betweenc1
andc2
.
Solution 2:
If you pass more than 1 parameter to count, it will use the intersection of those strings and will use that as the search target:
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)
Solution 3:
Let's break these down
a = "hello world"
-
to count the number of occurrences of the letters
l
ando
a.count "lo" #=> 5
-
to find the intersect of
lo
ando
(which is counting the number of occurrences ofl
ando
and taking only the count ofo
from the occurrences):a.count "lo", "o" #=> 2
-
to count the number of occurrences of
h
,e
,l
,l
ando
, then intersect with any that are notl
(which produces the same outcome to finding occurrences ofh
,e
ando
)a.count "hello", "^l" #=> 4
-
to count the number of occurrences of
e
and any letter betweenj
andm
(j
,k
,l
andm
):a.count "ej-m" #=> 4
Solution 4:
Each argument defines a set of characters. The intersection of those sets determines the overall set that count
uses to compute a tally.
a = "hello world"
a.count "lo" # l o => 5
a.count "lo", "o" # o => 2
And ^
can be used for negation (all letters in hello
, except l
)
a.count "hello", "^l" # h e o => 4
Ranges can be defined with -
:
a.count "ej-m" # e j k l m => 4