Rubyのlengthメソッドには、文字列の文字数を数える機能と配列の要素の数を数える機能とがあります。Rubyに限らずプログラムの中で数を数える処理はよく使われます。lengthメソッドはそのような場面で便利に使えるメソッドです。
とはいえRubyには同じ機能で違う名称のメソッドがあります。また、Rubyには配列の要素を扱うメソッドが幾つもあり、それらを使えばlengthメソッドを使う必要はありません。今回は、lengthメソッドの詳細と、lengthメソッドに関連するメソッドの使い方について紹介します。
Rubyのlengthメソッド
Rubyの特徴は、他のプログラム言語に比べて短い記述で読み易いプログラムが書ける点です。そして特に配列や文字列を加工するのに便利な機能が充実しています。
そのようなRubyでlenghメソッドと言えば、配列の数を調べるメソッドと文字列の長さを調べるメソッドのどちらかです。まずは、それぞれのlengthメソッドについて説明する前に、メソッドの基本とlengthの意味について説明します。
Rubyで扱う要素は全て何ならのクラスに含まれる
Rubyは、Webシステムの開発などに使われるオブジェクト指向のスクリプト言語です。そして、プログラムで使われる全ての変数やメソッドが、何らかのクラスに属している、という特徴を持っています。
つまり、配列の数を数えるlengthメソッドは、配列クラスに定義されたメソッドです。一方、文字列の文字数を数えるlengthメソッドは、文字列クラスに定義されています。
そのため配列と文字列のlengthメソッドは、同じ名称でますが、それぞれのクラスで別々に定義された別のメソッドです。名称が同じでも機能は全く違います。
Rubyには同じ機能のメソッドが複数ある
Rubyには同じ機能なのに別の名称のメソッドが使えたりします。そして今回紹介するlengthメソッドにも、同じ機能のメソッドがあります。それがsizeメソッドです。
sizeメソッドは、配列クラスと文字列クラスの両方でlengthメソッドと同じ機能として定義されているので、両方で使えます。
そもそもlengthとは何
Rubyで使われるメソッドの名称として、その処理を示す英単語が使われています。今回紹介するlengthメソッドも元は英単語です。なお英語のlengthはlongの名詞形で、日本語の「長さ」という意味です。
配列の長さ、または、文字列の長さ、と考えれば、lengthが使われた意味が分かるのではないでしょうか。
文字列に対して使うlengthメソッド
lengthメソッドを英語の長さの意味から連想すると、先に思いつくのは文字列の長さを調べるメソッドでしょう。まずは、文字列クラスの変数などに使用するlengthメソッドについて解説します。
文字列クラスのlengthメソッド
文字列クラスは、Rubyのプログラムで文字列を扱うための機能を提供するクラスです。そして文字列の長さを調べるメソッドがlengthです。使い方は簡単で変数に続けてドットで繋ぐだけで、引数はありません。lengthメソッドを適用すると、対象の文字列の文字数を返します。
lengthメソッドの文法
(文字列).length
文字列にlengthメソッドを適用した例
str = "これは文字列です" p str # "これは文字列です"を表示する p str.length # 8を表示する
sizeメソッドも同じ
先ほど紹介したように文字列の変数などに含まれる文字数を返すメソッドはlengthだけではありません。文字列クラスにはsizeメソッドも定義されており、機能と使い方はlengthメソッドと同じです。
sizeメソッドの文法
(文字列).size
文字列にsizeメソッドを適用した例
str = "これは文字列です" p str # "これは文字列です"を表示する p str.size # 8を表示する
かな漢字も1文字と数える
Rubyに限らず日本語のカナや漢字を扱う場合、それらが全角文字である点に注意してください。というのは、半角のアルファベットや数字は1文字が1バイトです。そのため文字列を扱う関数が半角のアルファベットを前提に作られていることがよくあります。
しかし、Rubyの文字列を扱うlengthメソッドは、かなや漢字などの全角文字を1文字として扱います。全角の文字と半角のアルファベットが混在していても問題ありません。
なお、プログラムによっては文字列のバイト数を計算するケースもあります。この場合、バイト数は文字数ではありあません。そしてRubyにはバイト数を求める専用のbyteslice関数があるので、そちらを利用してください。
配列に対して使うlengthメソッド
先ほど文字列クラスに定義されたlengthメソッドを説明しましたが、lengthメソッドは配列クラスにも定義されています。先ほど説明したようにRubyのメソッドはクラス毎に定義されているので、配列クラスのメソッドは先ほどの文字列クラスのメソッドとは別のものです。
次から配列の要素の数を調べるlengthメソッドについて紹介します。
配列の個数を調べるlengthメソッド
配列は繰り返し処理と相性が良いことから、プログラムの中でよく利用される変数です。特にRubyには配列を操作する便利なメソッドが多く、データベースから取得したデータを扱うケースなどでよく利用されています。そして、そのような配列の個数を調べるメソッドがlengthです。
lengthメソッドの文法
(配列).length
lengthメソッドは、配列に含まれる要素の個数を返します。
配列のlengthメソッドの使用例
arr = [1, 2, 3, 4, 5] p arr.length # 5を返す
配列の個数はsizeメソッドでも調べられる
文字列の長さを数えるメソッドには、lengthメソッドとsizeメソッドがあり、使い方は同じだと説明しました。配列の個数についてもsizeメソッドが使えます。そして、sizeメソッドの使い方は、lengthメソッドと同じです。
sizeメソッドの文法
(配列).size
sizeメソッドは、配列に含まれる要素の個数を返します。
配列のlengthメソッドの使用例
arr = [1, 2, 3, 4, 5] p arr.size # 5を返す
配列には便利なメソッドが多い
Rubyに限らず配列は繰り返し処理でよく使われます。他のプログラム言語を学んだ方の中には、配列の数だけ繰り返し処理をやれば良い、と考える方がいるかもしれません。
しかし、Rubyには配列を操作する便利なメソッドがたくさんあります。もしRubyで配列の要素を扱うプログラムを作るのなら、そのようなメソッドを活用してください。
Rubyの配列を使った例
arr = [1, 2, 3, 4, 5] sum = arr.sum # 15を返す (配列の要素の合計を求める) calc = arr.map {|n| n * 10 } # [10, 20, 30, 40, 50] (配列の全ての要素を10倍にした配列を返す)
また、配列クラスのeachメソッドを利用して、ブロック内に複雑な処理を記述することも可能です。
eachメソッドの例
arr.each { |x| if x % 2 == 0 then bai_b += 1 end if x % 3 == 0 then bai_t += 1 end if x % 5 == 0 then bai_f += 1 end }
この例は配列arrの要素をチェックし、2,3,5で割り切れる数を算出する処理です。このようにRubyではlengthメソッドで配列の数を算出しなくても、配列を使った繰り返し処理を作れるので、要素を調べたり加工することが可能です。
配列のlengthと似ているcountメソッド
先ほど説明したように配列クラスのlengthメソッドは配列の要素の数を返しますが、Rubyではそれと似た機能のcountメソッドも使えます。
countメソッドは、ブロックで指定した条件に一致する配列の要素の数を調べるメソッドです。そして、条件を指定しなかった場合はlengthメソッドと同じく要素の数をます。
countメソッドの使い方
(配列).count 条件
条件には、()で引数として指定する方法と、ブロックで処理を指定する方法が使用できます。
countメソッドの例
arr = [1, 2, 3, 4, 5 ] p arr.count # 5を表示する。条件を指定しないのでlengthメソッドと同じ p arr.count(2) # 1を表示する。()内に指定した条件と一致する要素の数を返す p arr.count { |x| x%2==0 } # 2を表示する。ブロック内に2で割り切れる数という条件を指定している
まとめ
これまで紹介したようにlengthメリットは、文字列の文字数を調べたり、配列の要素の数を調べるメソッドです。実際にはそれぞれが別のクラスに属するでので、同じ名称ですが機能は全く違います。
また、それぞれのlengthメソッドには同じ機能のメソッドがあり、それがsizeメソッドです。なお、Rubyには配列の要素を扱うメソッドがたくさんあるので、lengthメソッドを使わなくても繰り返し処理が可能です。lengthメソッドの使い方だけでなく、そのような使い方もマスターしてください。