オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。今回は、Arrayの基本操作、スタック/キューとしての使い方、さまざまなメソッド、Hashの基本的な使い方、連想配列のいろいろな初期化方法などについて。
前回の連載第2回記事「Ruby 2.1の基本構文/基本文法まとめ&Pryの使い方」では、Rubyの基礎と題して、変数とオブジェクト、定数、リテラル、式と演算子、制御構文について、主要なものを学習しました。ここまでの連載で、Rubyの基本的なプログラムが書けるようになったと思います。
今回からは数回に分けて、Rubyの組み込みライブラリについて、ちょっとしたスクリプトを交えながら解説していきます。読み終わったころには、ライブラリを使ってさまざまなプログラムを書けるようになっていることでしょう。日々の作業の自動化などに、ぜひお役立てください。
組み込みライブラリはRuby本体に含まれているため、特に何も意識することなく、すぐに使えます。
今回は、ArrayクラスやHashクラスなど「配列」「コンテナー」「コレクション」「スタック」「キュー」「連想配列」「ハッシュ(テーブル)」を表現するものについて説明します。
Arrayクラス(以下「Array」と略記)は、おそらくRubyで最もよく使われる「コンテナー」(複数のデータを集めて管理するためのクラス。「コレクション」とも呼ぶ)でしょう。単純に「配列」と呼ぶこともあり、直感的にはC言語の影響を受けた言語でいうところの配列と似ています。
ここでは、前回同様、pryを使ってArrayの基本操作を学びます。まずは以下のコマンドを入力して、pryを起動しましょう。
$ pry
まずは、空のArrayオブジェクトを作ってみます。
[1] pry(main)> array = [] => []
以下のようにして空のArrayオブジェクトを作ることもできます。
[2] pry(main)> array = Array.new => []
いずれの場合も戻り値は空のArrayオブジェクトです。どちらの記法を使うかは、あなた自身の好みやプロジェクトの慣習に従うのが良いでしょう。
続いて、新しいオブジェクトを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を使います。
[6] pry(main)> array.length => 3 [7] pry(main)> array.size => 3
では、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オブジェクトを検索し、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オブジェクトに含まれているオブジェクトを全て取り除きたいときは、Array#clearを使います。
[18] pry(main)> array.clear => [] [19] pry(main)> array => []
Copyright © ITmedia, Inc. All Rights Reserved.