Rubyの配列、ハッシュテーブルを表現するArray、Hashクラスの使い方:若手エンジニア/初心者のためのRuby 2.1入門(3)(1/4 ページ)
オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。今回は、Arrayの基本操作、スタック/キューとしての使い方、さまざまなメソッド、Hashの基本的な使い方、連想配列のいろいろな初期化方法などについて。
Rubyの組み込みライブラリとは
今回の主な内容
- Rubyの組み込みライブラリとは
- 「配列」を表現する「Array」クラスの基本的な使い方
- Arrayオブジェクトは配列だけではなく「スタック」「キュー」としても扱える
- オブジェクトの順序に関連するArrayのメソッド
- オブジェクトの選択に関連するArrayのメソッド
- オブジェクトの整形に関連するArrayのメソッド
- Array#zipで「配列の配列」(2次元配列)を作る
- Array#mapなどは「クロージャ」の回で
- 「連想配列」「ハッシュ(テーブル)」を表現する「Hash」クラスの基本操作
- 連想配列の初期化いろいろ
- Hash#merge、Hash#merge!で連想配列を統合する
- Hash#invertでキーと値を入れ替える
- リファレンスマニュアルも参照しよう
前回の連載第2回記事「Ruby 2.1の基本構文/基本文法まとめ&Pryの使い方」では、Rubyの基礎と題して、変数とオブジェクト、定数、リテラル、式と演算子、制御構文について、主要なものを学習しました。ここまでの連載で、Rubyの基本的なプログラムが書けるようになったと思います。
今回からは数回に分けて、Rubyの組み込みライブラリについて、ちょっとしたスクリプトを交えながら解説していきます。読み終わったころには、ライブラリを使ってさまざまなプログラムを書けるようになっていることでしょう。日々の作業の自動化などに、ぜひお役立てください。
組み込みライブラリはRuby本体に含まれているため、特に何も意識することなく、すぐに使えます。
今回は、ArrayクラスやHashクラスなど「配列」「コンテナー」「コレクション」「スタック」「キュー」「連想配列」「ハッシュ(テーブル)」を表現するものについて説明します。
「配列」を表現する「Array」クラスの基本的な使い方
Arrayクラス(以下「Array」と略記)は、おそらくRubyで最もよく使われる「コンテナー」(複数のデータを集めて管理するためのクラス。「コレクション」とも呼ぶ)でしょう。単純に「配列」と呼ぶこともあり、直感的にはC言語の影響を受けた言語でいうところの配列と似ています。
Array#newなどで空のArrayオブジェクトを作成
ここでは、前回同様、pryを使ってArrayの基本操作を学びます。まずは以下のコマンドを入力して、pryを起動しましょう。
$ pry
まずは、空のArrayオブジェクトを作ってみます。
[1] pry(main)> array = [] => []
以下のようにして空のArrayオブジェクトを作ることもできます。
[2] pry(main)> array = Array.new => []
いずれの場合も戻り値は空のArrayオブジェクトです。どちらの記法を使うかは、あなた自身の好みやプロジェクトの慣習に従うのが良いでしょう。
Array#push、<<演算子でオブジェクトの追加
続いて、新しいオブジェクトをArrayオブジェクトに追加してみます。
[3] pry(main)> array.push(1) => [1] [4] pry(main)> array << 2 => [1, 2] [5] pry(main)> array << "3" => [1, 2, "3"]
「Array#push」は、Arrayオブジェクトに新しいオブジェクトを追加するためのメソッドです。また、3行目のように、「<<」演算子を使ってオブジェクトを追加することもできます。好みの分かれるところですが、筆者の経験上では、<<演算子を使うケースの方が多いようです。
1行目と3行目で追加したオブジェクトは1、2といった整数ですが、5行目で追加したオブジェクトは"3"という文字列です。このように、Rubyの配列には好きな型のデータを追加できます。配列に含まれているオブジェクト全てが同じ型である必要はありません。
補足「メソッドの表記方法について」
Rubyでは、例えばArrayクラスのpushメソッドを表現するために、Array#pushといった書き方をするのが慣例となっています。この連載においても、そのルールに倣って表現します。
Array#length、Array#sizeで要素数を取得する
また、要素数を取得するためにはArray#length、もしくはArray#sizeを使います。
[6] pry(main)> array.length => 3 [7] pry(main)> array.size => 3
Array#atや[](角カッコ)でオブジェクトの参照
では、Arrayオブジェクトに含まれるデータに実際にアクセスしてみましょう。C言語の影響を受けた言語のように[](角カッコ)を使うか、Array#atを用いてオブジェクトを取り出すことができます。角カッコを使う方が自然です。
[8] pry(main)> array[0] => 1 [9] pry(main)> array.at(1) => 2 [10] pry(main)> array[5] => nil
Arrayオブジェクトのインデックスは0から始まり、もし範囲外のインデックスを指定した場合はnilが返ってきます。
インデックスに負の数を使える
また、インデックスに負の数を使うと、「後ろから数えてn番目」のオブジェクトを取り出せます。
[11] pry(main)> array[-1] => "3" [12] pry(main)> array[-2] => 2 [13] pry(main)> array[-3] => 1
インデックスとして-1を指定すると、配列の最後尾にある"3"というオブジェクトを取得できます。-2を指定すると、"3"の前に位置する2が取得でき、同様に-3を指定すると1が取得できます。
インデックスの範囲を指定できる
また、以下のように書くと、範囲を指定してオブジェクトを取り出すことができます。
[14] pry(main)> array [1..2] => [2, "3"]
Array#delete、Array#delete_atでオブジェクトの削除
オブジェクトを取り除くためには、Array#delete、もしくはArray#delete_atを使います。これらのメソッドの戻り値は、削除された要素そのものです。
Array#deleteはArrayオブジェクトを検索し、Array#deleteの引数と等しいオブジェクトを取り除きます。
Array#delete_atは、引数に指定されたインデックスの要素を取り除きます。
[15] pry(main)> array.delete(1) => 1 [16] pry(main)> array.delete_at(0) => 2
ここで、現在Arrayオブジェクトに含まれているオブジェクトを確認してみましょう。
「array.delete(1)」によって1が取り除かれ、「array.delete_at(0)」によって、[2, "3"]の0番目のオブジェクト、すなわち2が取り除かれたので、残ったのは"3"だけになります。
[17] pry(main)> array => ["3"]
Array#clearでオブジェクトの全削除
Arrayオブジェクトに含まれているオブジェクトを全て取り除きたいときは、Array#clearを使います。
[18] pry(main)> array.clear => [] [19] pry(main)> array => []
Copyright © ITmedia, Inc. All Rights Reserved.