Just do IT

思うは招く

Ruby でレシーバの要素数を返すメソッド count

Enumerable#count (Ruby 2.7.0 リファレンスマニュアル)

・引数なしの場合、レシーバの要素数を返す

ary = [1, 2, 4, 2]
ary.count             
# => 4

・引数をひとつ指定した場合、レシーバの要素から合致するものを返す

ary = [1, 2, 4, 2]
ary.count(2)         
# => 2

※2を引数に渡して、配列に2があるので返している。2がふたつ返っているわけではない。

・ブロックを渡す場合、ブロック内の式が真になった場合の要素の個数をカウントして返す

ary = [1, 2, 4, 2]
ary.count { |x| x % 2 == 0 }  
# => 3

※ 2で割り切れる要素は3つあるので、3を返している。

zipメソッドと組み合わせてみる

たとえば、以下の2つの配列がある場合。

ary1 = ["g", "o", "a", "t"]
ary2 = ["g", "o", "o", "t"]

zipメソッドを使うと、2つの配列をイテレートできる。

Array#zip (Ruby 2.7.0 リファレンスマニュアル)

ary1.zip(ary2).count { |a, b| a != b }
=> 1

この場合、2つの配列の要素同士を比較して、それぞれが異なる要素ならカウントしている。これらの配列の場合だと、異なる要素は1つなので1が返っている。

気づき

自分は今まで、何かをカウントする場合はnum = 0などと変数を設定して、if文回して条件に合致したら変数に数値を足して、ループ外でnumをreturnする、みたいなことをしていた。

例:

   num = 0
   ary1.zip(ary2) do |x, y|
     if x != y
       num += 1
     end
   end
   num

しかし、countメソッドを使えば簡単に書けて、コードもめちゃくちゃ短くなる。便利だー。