初心者を突破するために知っておこう。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系なのでこちらを見ていきます。
組み込みライブラリをみて、該当するクラスのページへ飛びます。今回は、ArrayとStringになります
今回扱うlengthとsizeはインスタンスメソッドになります。 インスタンスメソッドがわからない方は以下の本どちらかを読みましょう。
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る
- 作者: まつもとゆきひろ,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などについてはこちらを参照してみよう
実際にRuby自体のCコードもlengthとsizeで同じ処理が呼ばれている、ことが確認できましたね。
最後に
このように、少しでも気になった処理があったら、まずは以下を順番に見てみることをおすすめします。継続することで確実な力が身についていきます。
- リファレンスマニュアルを見る
- Rubyコードを見る