Rubyの配列、ハッシュテーブルを表現するArray、Hashクラスの使い方:若手エンジニア/初心者のためのRuby 2.1入門(3)(4/4 ページ)
オープンソースのオブジェクト指向プログラミング言語「Ruby」の文法を一から学ぶための入門連載。最新版の2.1に対応しています。今回は、Arrayの基本操作、スタック/キューとしての使い方、さまざまなメソッド、Hashの基本的な使い方、連想配列のいろいろな初期化方法などについて。
「連想配列」「ハッシュ(テーブル)」を表現する「Hash」クラスの基本操作
Hashクラス(以下「Hash」と略記)は、Arrayに次いでよく使われるコンテナーです。「連想配列」や「ハッシュテーブル」と呼ぶこともあります。
Arrayでは要素の位置を示す整数インデックスとオブジェクトのペアでオブジェクトを管理していました。Hashでは、要素の位置を表す整数インデックスの代わりに、シンボルや文字列など、任意のオブジェクトをキーにして、オブジェクトを指し示すことができます。
連想配列のHashオブジェクトを作成
では、Hashの基本操作を覚えるために、pryを使って以下のように実行してみましょう。
[1] pry(main)> hash = {"jack" => 11, "queen" => 12, :king => 13} => {"jack"=>11, "queen"=>12, :king=>13}
まず、[1]では連想配列のオブジェクトを作成し、変数「hash」に代入しています。「{key1 => value1, key2 => value2, …… }」という形で連想配列を初期化できます。
Hash#length、Hash#sizeで連想配列の要素数を取得
また、Hash#lengthまたはHash#sizeを使うことで、連想配列に含まれている要素数を取得できます。
[2] pry(main)> hash.length => 3 [3] pry(main)> hash.size => 3
[](角カッコ)で連想配列の要素にアクセス
連想配列の要素にアクセスする場合は[](角カッコ)を使います。[6]のように、存在しないキーを指定するとnilが返ります。
[4] pry(main)> hash["queen"] => 12 [5] pry(main)> hash[:king] => 13 [6] pry(main)> hash[:ace] => nil
Hash#keysでキーの一覧を、Hash#valuesでオブジェクトの一覧を取得
キーの一覧やキーに関連付けられたオブジェクトの一覧は、Hash#keysとHash#valuesで得ることができます。[7]のように、Hash#keysはキーの一覧を配列として返します。また、[8]のように、Hash#valuesはオブジェクトの一覧を配列として返します。
[7] pry(main)> hash.keys => ["jack", "queen", :king] [8] pry(main)> hash.values => [11, 12, 13]
[](角カッコ)と=演算子で連想配列にオブジェクトを格納
連想配列にオブジェクトを格納するときは、[](角カッコ)と「=」演算子を使います。[9]で「:ace」をキーとして「1」という整数を格納しており、[10]のようにhashの内容を確認すると、「:ace=>1」が格納されていることが分かります。[11]では[](角カッコ)を使って、「:ace」をキーとするオブジェクトを取り出しています。
[9] pry(main)> hash[:ace] = 1 => 1 [10] pry(main)> hash => {"jack"=>11, "queen"=>12, :king=>13, :ace=>1} [11] pry(main)> hash[:ace] => 1
Hash#deleteで連想配列から要素を削除
また、Hash#deleteを使うと、引数に指定したオブジェクトをキーとする要素を、連想配列から取り除けます。
[12]では"jack"という文字列をキーとする要素を取り除いており、[13]のようにhashの内容を確認すると、「"jack"=>11」という要素が取り除かれていることが分かります。
[12] pry(main)> hash.delete("jack") => 11 [13] pry(main)> hash => {"queen"=>12, :king=>13, :ace=>1}
Hash#clearで連想配列を空にする
最後に、Hash#clearは連想配列を空にするためのメソッドです。[14]でHash#clearを用いてhashを空にし、[15]でhashが空になったことを確認しています。
[14] pry(main)> hash.clear => {} [15] pry(main)> hash => {}
連想配列の初期化いろいろ
Hash#new、{}リテラルで空の連想配列を作る
空の連想配列を作る場合には、2通りの方法があります。「{}」リテラルを用いる場合と、Hashのクラスメソッド「new」を用いてオブジェクトを生成する場合です。
[1] pry(main)> hash = {} => {} [2] pry(main)> hash = Hash.new => {}
シンボルをキーとして使った連想配列
連想配列を初期化する場合、基本的に「{key1 => value1, key2 => value2, …… }」という形式で書きます。シンボルを使う場合も、この記法が使えます。
[1] pry(main)> {:jack => 11, :queen => 12, :king => 13} => {:jack=>11, :queen=>12, :king=>13}
シンボルをキーとする連想配列用の「シンタックスシュガー」
ただし、Rubyではシンボルをキーとした連想配列がよく使われるので、シンボルをキーとする連想配列用の「シンタックスシュガー」(糖衣構文、プログラミング言語において、読み書きのしやすさのために導入される構文)があります。
「{key1: value1, key2: value2, …… }」というように、キーの後に「: 」が来てその後に値を指定する形式で書けます。
[2] pry(main)> {jack: 11, queen: 12, king: 13} => {:jack=>11, :queen=>12, :king=>13}
[2]は[1]と等価ですが、[2]の方がよりスッキリとしていて見やすいため、多くのRubyプログラマーはこのシンタックスシュガーを好みます。
デフォルト値を指定する初期化
通常、存在しないキーを指定してオブジェクトを取り出そうとすると、nilが返ります。しかし、場合によっては、キーが存在しない場合に別のオブジェクトを返したいことがあります。そのようなときは、連想配列の初期化の際にデフォルト値を指定できます。
[1] pry(main)> hash = Hash.new(:default) => {} [2] pry(main)> hash[:ace] => :default
ここでは、[1]のようにHash.newの引数にデフォルト値として「:default」というシンボルを設定しています。そのため、[2]のように存在しないキー「:ace」を使ってオブジェクトを取り出すと、シンボル「:default」が返ります。
Hash#to_aで連想配列から配列を生成
Hash#to_aを使うと、連想配列から配列を生成できます。この場合、キーと値で構成されている要素数2の配列が複数並んだ配列(配列の配列)が返ります。少しややこしいですが、[1]の例を見れば理解できると思います。
[1] pry(main)> {jack: 11, queen: 12, king: 13}.to_a => [[:jack, 11], [:queen, 12], [:king, 13]]
Hash#flattenで連想配列を平滑化したような配列を生成
Hash#flattenを使うと、連想配列を平滑化したような配列を生成できます。Hash#to_aとは違い、キーと値が順に並んだような配列が生成されます。
[1] pry(main)> {jack: 11, queen: 12, king: 13}.flatten => [:jack, 11, :queen, 12, :king, 13]
Hash#merge、Hash#merge!で連想配列を統合する
連想配列を統合するときには、Hash#mergeを使います。Hash#mergeは、自身と引数に与えたハッシュを統合したハッシュを返します。Hash#merge!はHash#mergeの破壊的メソッド版です。
[1] pry(main)> {jack: 11, queen: 12, joker: 14}.merge({ace: 1, king: 13, joker: 15}) => {:jack=>11, :queen=>12, :joker=>15, :ace=>1, :king=>13}
この例のようにキーが重複した場合(:joker)は、Hash#mergeの引数に与えたキーとオブジェクトのペアが優先されます。
Hash#invertでキーと値を入れ替える
キーと値の関係を逆転させたような連想配列を生成するときは、Hash#invertが便利です。ただし、入れ替え後にキーが重複してしまう場合の動作は不定です。
[1] pry(main)> {jack: 11, queen: 12, king: 13}.invert => {11=>:jack, 12=>:queen, 13=>:king}
リファレンスマニュアルも参照しよう
Arrayと同様、Hashについても使用頻度の高いメソッドを幾つか紹介しました。もっとHashについて知りたい場合は、リファレンスマニュアルを見てください。
次回は、引き続きRubyの組み込みライブラリ
次回は、引き続きRubyの組み込みライブラリから紹介しますので、お楽しみに。
- Rubyで逆ポーランド変換機を作りgem作成&コマンドの使い方
- 難しいが強力! Rubyのメタプログラミング、self、特異クラス/メソッド、オープンクラスとモンキーパッチ
- RubyのThread、Fiber、Kernel、forkで並列処理やプロセスの深淵へ
- RubyのFile/IOクラスで入力と出力、ファイルの読み取りと書き込み、フィルター作成
- Rubyの例外とその捕捉――基本のbegin〜rescue〜endからensure、else、retry、後置rescueまで
- Rubyの面白さを理解するためのメソッド、ブロック、Proc、lambda、クロージャの基本
- Rubyのオブジェクト指向におけるクラスとモジュール、継承、Mixin、アクセス制御の使い方
- RubyのNumericとTimeで数値と時間をさまざまな操作・演算・判定
- RubyのString/Regexpクラスによる強力な文字列操作/正規表現
- RubyのRangeクラスと範囲オブジェクト、範囲演算子、イテレーターの使い方
- Rubyの配列、ハッシュテーブルを表現するArray、Hashクラスの使い方
- Ruby 2.1の基本構文/基本文法まとめ&Pryの使い方
- Rubyプログラミングを始めるための基礎知識とインストール
著者プロフィール
麻田 優真(Rails技術者認定シルバー試験問題作成者)
イタリア、ローマ生まれ。中学生のころHSPに初めて触れ、プログラミングの楽しさを知る。オープンソースやハッカーカルチャーを好む。C#からRubyに転向したときに、動的型付け言語の柔軟性やメタプログラミングの魅力に感動し、Rubyとともにプログラマーとしての人生を歩む決意を固める。
現在は奈良先端科学技術大学院大学で学生として所属するかたわら、株式会社アジャイルウェアでプログラマーとして従事。Ruby on Railsによるコンシューマー向けのWebサービスの開発などに尽力している。
好きなメソッドは、define_method。
Twitter:@Mozamimy、ブログ:http://blog.quellencode.org/
監修者プロフィール
山根 剛司(Ruby業務開発歴7年)
兵庫県生まれ。1997年からベンチャー系のパッケージベンダーで10年間勤務。当時、使用していた言語はJavaとサーバーサイドJavaScript。
2007年よりITコンサル会社に転職し、Rubyと出会って衝撃を受ける。基幹システムをRuby on Railsで置き換えるプロジェクトに従事。それ以来Ruby一筋で、Ruby on Railsのプラグインやgemも開発。
2013年より、株式会社アジャイルウェアに所属。アジャイルな手法で、Ruby on Railsを使って企業向けシステムを構築する業務に従事。
Ruby関西所属。
Twitter:@spring_kuma、Facebook:山根 剛司
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 3万5000円の参加費でも内外から580人の参加登録:公用語に英語、「再起動」したRubyKaigi 2013が東京で開催
いったん終了していたRubyコミュニティ主催の年次イベントが再開。技術色、国際色を強め、盛況のうちに幕を閉じた - IT業界 転職市場最前線(48):Web業界、今から行くならRubyエンジニアが狙い目?
不況で冷え込んでいたIT業界の転職市場に、回復の兆しが見え始めている。だが、業種や職種によって採用数や条件に大きな差異が生まれている。転職市場の動向を追い、自身のキャリア戦略立案に生かしてほしい。 - 安定版のメジャーバージョンアップ:Ruby 2.0.0がリリース、大規模化対応の機能などを搭載
生誕20年となる節目を迎えて、プログラミング言語「Ruby」の最新版がリリースされた - 新バージョンで何が変わるのか、Rubyはどこへ向かうのか:まつもと×笹田、Ruby 1.9を語る
- いよいよ始まるRuby 1.9への移行:開発コアメンバが語るRubyの今とこれから(前編)
- Rubyの今後の進化の方向性とは?:開発コアメンバが語るRubyの今とこれから(後編)
- 互換性や脆弱性の問題にどう対応していくのか:Rubyが抱える課題、NaClの前田氏が講演
- Rails Hub情報局:「なんでRubyなんか作った!? 迷惑だ!」に対するMatzの答え
- Rails Hub情報局:Rubyはイノベーション言語として選ばれている
- Rails Hub情報局:Rubyのまつもと氏は、一発屋で終わるのか?
- Rails Hub情報局:Rubyに魔法は要らない
- 数々の“スペル”で高度なプログラミング:Rubyの魔術
- 晴読雨読@エンジニアライフ:『たのしい開発 スタートアップRuby』――なぜRubyistたちはあれほど楽しそうなのか
- Ruby 1.9.3に対応:「JRuby 1.7.0」登場、1年半ぶりのメジャーアップデート
JavaVM上のRuby実装「JRuby」の最新版となる「JRuby 1.7.0」が、10月22日にリリースされた。