世界が幸せで在ります様に

ITエンジニアになりたい人・エンジニアの人にとって役立ちそうな商品を紹介するブログ

初心者を突破するために知っておこう。Rubyの「length」と「size」について

Rubyのlengthとsizeというメソッドは、Rubyを書いた人ならば使ったことあると思います。この2つのメソッドは同じ結果を返すのでどっちを使っても良いと言われていますが、本当にそれを目で確認した方はいますか?

もし、確認していなかったら一緒に見ていきましょうか。すごい便利なGemやメソッドを知ることももちろん重要ですが、こういう小さな積み重ねをすることによって、Rubyプログラマとしてさらに上達すると思います。

環境

  • Ruby v2.5.1

では、簡単にコードを書いてみましょう

[*1..10].length # 10
'hoge'.size # 4

全く迷う余地はないですね。ただ、この2つをどう書き分けるか?という点においてはどうでしょう。実際に核となる部分で全く同じ処理が走っている、と言い切れますか??

こういう、迷うときっていくつかあると思うので、その際の手順をまとめたいと思います。

まずは公式をみましょう

  • https://www.ruby-lang.org/ja/documentation/
  • 公式の中から、「Rubyリファレンスマニュアル Ruby 2.5.0版」を探す(※当然、自分の使っているバージョンを見る必要があります)

僕の場合、Ruby2.5系なのでこちらを見ていきます。

組み込みライブラリをみて、該当するクラスのページへ飛びます。今回は、ArrayStringになります

今回扱うlengthとsizeはインスタンスメソッドになります。 インスタンスメソッドがわからない方は以下の本どちらかを読みましょう。

プログラミング言語 Ruby

プログラミング言語 Ruby

  • 作者: まつもとゆきひろ,David Flanagan,卜部昌平(監訳),長尾高弘
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2009/01/26
  • メディア: 大型本
  • 購入: 21人 クリック: 356回
  • この商品を含むブログ (129件) を見る

Arrayのインスタンスメソッドの中にlengthとsizeが見つかるはずです。

配列の長さを返します。配列が空のときは 0 を返します。(引用https://docs.ruby-lang.org/ja/2.5.0/class/Array.html#I_LENGTH)

なおStringの方も引用してみます。

文字列の文字数を返します。バイト数を知りたいときは bytesize メソッドを使ってください。(引用https://docs.ruby-lang.org/ja/2.5.0/class/String.html#I_LENGTH)

lengthとsizeがどちらも同じメソッドの結果を返してくれることが一旦はわかりました。

次に実際のRubyコードをみましょう

// https://github.com/ruby/ruby/blob/trunk/array.c#L6433-L6434
// 定義されているメソッド
rb_define_method(rb_cArray, "length", rb_ary_length, 0);
rb_define_alias(rb_cArray,  "size", "length");

static VALUE
rb_ary_length(VALUE ary)
{
    long len = RARRAY_LEN(ary);
    return LONG2NUM(len);
}

ArrayクラスやRARRAY_LENなどについてはこちらを参照してみよう

github.com

github.com

実際にRuby自体のCコードもlengthとsizeで同じ処理が呼ばれている、ことが確認できましたね。

最後に

このように、少しでも気になった処理があったら、まずは以下を順番に見てみることをおすすめします。継続することで確実な力が身についていきます。

  1. リファレンスマニュアルを見る
  2. Rubyコードを見る

プロフィールと免責事項