どぼじょのIT学習ブログ

高専卒土木女子がIT業界を目指してお勉強。

Ruby入門 part6

Ruby入門も第6部となりました!

内容量的には半分くらいでしょうか…?笑

目次

1.ハッシュ

1-1. ハッシュオブジェクト、値の取得

「ハッシュ」はオブジェクトのひとつで、複数の他のオブジェクトをまとめて管理することができます。
配列と似ている気がしますね〜🙂ハッシュは「連想配列」とも言うそうです。
配列と異なる点は、キーというものを使って他のオブジェクトを管理するところです。ちなみに配列では「インデックス」と呼ばれる番号を使っていましたねー。
参考記事:Ruby入門 part5

ハッシュの使い方は以下のとおりです。

{キー1 => 値1, キー2 => 値2, ...}

=>はたぶん矢印の形ですね。less thanの記号>=とは違いますよ👀
インデックスというものは無いので、書いていくのに順番は関係無さそうですね。
なので、インデックスの数字を使って値を取り出すことはできません。
ハッシュオブジェクトから値を取り出すには、以下のように書きます🖊

ハッシュオブジェクト名[キー]

キーの名前を指定すると値が出力されるというのは便利ですね!何番目に書いたか分からなくても良いですね。
これはハッシュオブジェクト名.fetch(キー)という書き方もできます。
ちなみに、fetchメソッドを使うと、存在しないキーを指定した時のデフォルトの戻り値をnilから変更することもできます。
例えばfetch(キー,"none")とすると、存在しないキーに対するデフォルトの戻り値はnoneという文字列になります🙂

1-2. Hashクラス

ハッシュオブジェクトの元になっているのはHashクラスです。Hashクラスで使える様々なメソッドをご紹介します✨

ひとつめはクラスメソッドの[ ] を使ってハッシュオブジェクトを作る方法です。
先程紹介したハッシュオブジェクトの作り方では、{ }の中に[キー,値]という組み合わせがありましたが、今度は[ ]の中にキーと値を交互に指定していきます。

Hash[キー1, 値1, キー2, 値2, ...]

ただし、キーも値も文字列だったり数値だったりするので、長くなるとどっちがどっちだか分からなくなりそうですね…😶
ややこしくなりますが、以下のようにという書き方もできます。

Hash[キー1 => 値1, キー2 => 値2, ...]

1-1で紹介した書き方は、hashという文字はなく{ }でした。クラスメソッドのhash[ ]を更に簡単にした書き方が{ }と言えるのかもしれません💡💡

次に、newを使った書き方です。

Hash.new( ifnone )

これで空のハッシュオブジェクトを作ることが出来ました! ifnoneのところは、空のオブジェクトのデフォルトの値をnil以外にしたい時に指定できます。
例えばHash.new("nanimonaiyo")にすると、オブジェクトの値はnilではなくnanimonaiyoになります😆
省略してHash.new()とすると、空の値はnilを返します。
とは言っても作ったのは空のハッシュメソッドなので、これだけでは「何に使うのかな🤔???」状態です。ひとまず先に進みます🚄

続いて、ブロック付きクラスメソッドです。

Hash.new {|ハッシュ名, キー名| ブロック }

ブロック引数の「ハッシュ名」にはハッシュ自身、キー名には指定されたキーが入ります。
また、存在しないキーを指定するとブロックの部分を実行します。
Ruby入門の解説が難しかったので、こちらのサイトを参考にさせていただきました!

ref.xaio.jp

サイトの解説を真似して実際にやってみました。

gist.github.com

respond_to?メソッドについて詳しいことはまだよく分かりませんが、if文の意味は「キーのオブジェクトに*(掛け算)の演算子があれば、2を掛けた結果を値として保存する」ということらしいです。
掛け算の演算子が使えるのは数値と文字列だったと思います💡
実行結果は以下のとおりです。
f:id:mistyrinth:20181120171303p:plain
細かいことはさておき、{ }の中のハッシュ、キー、ブロックという構造が分かったので先に進みます😇

次は、クラスメソッドの[ ]を使った例です。

`Hash[ハッシュ名]`

引数(ハッシュ名)に、他のハッシュオブジェクトを指定することができます!
ハッシュオブジェクトをコピーする感じですね。このとき、コピー元とコピー先のハッシュが参照するオブジェクトは同一になります。

1-3. デフォルトの設定

これまでに紹介した中で何度か、存在しないキーを指定したときのデフォルトの戻り値についての説明がありました💡
さらっと進めてしまったので復習ですが、大きく分けて以下の2つです。

  • fetchメソッドを使った設定方法
  • newメソッドを使った設定方法

fetchメソッドを使う時はハッシュオブジェクト名.fetch(キー,デフォルトの戻り値)でした。
newメソッドを使うときはHash.new(デフォルトの戻り値)や、ブロック{ }を使った方法がありました👀

デフォルトの戻り値を設定する方法は、他にもう1つあるので紹介します!
defaultメソッドを使った方法です。

ハッシュオブジェクト名.default = デフォルト値

これが一番見た目上簡単な気がしますね😗

1-4. 要素の追加と値の変更

既存のハッシュオブジェクトに対して、要素を追加したり値を変更することができます!

ハッシュオブジェクト[キー] = オブジェクト

そのままですね😊😊
また、storeメソッドというものもあります。

ハッシュオブジェクト名.store(キー,値)

既存のキーを指定すれば、値が上書きされます。存在しないキーを指定すれば、新しくキーが作成されます✨
これだけ見るとシンプルなのに、さっきまでデフォルトの戻り値について学習してたせいかちょっと混乱してきますね😂

以下にサンプルのプログラムを書きました!

gist.github.com

結果は以下のとおりです。
f:id:mistyrinth:20181120175814p:plain

1-5. ハッシュのサイズの取得

ハッシュのサイズを取得するには、lengthメソッド(別名:sizeメソッド)が使えます。
配列オブジェクトの時と同じですね〜✨

ハッシュオブジェクト名.length

書き方も配列の時と同じなので、サンプルプログラムは割愛します😇
参考記事:Ruby入門 part5

1-6. ハッシュに対する繰り返し

ハッシュに対して繰り返しを使うこともできます。
まずはeachメソッド(別名:each_pairメソッド)です。

ハッシュ名.each{|key, value|
    実行する処理1
    実行する処理2
}

ここではkeyvalueは他の文字列を使っても良いですが、ハッシュに格納されている要素のそれぞれのキーと値を指しているので、そのままの文字を使ったほうがわかりやすいと思います。
書き方だけ見るとちょっと想像しにくいのですが、例えば以下のように使うことができます!
keyvalueが任意の文字列を指していることがわかるように、ここではそれぞれkevaluと名付けてみました。

gist.github.com

結果は以下のとおりです。
f:id:mistyrinth:20181120182943p:plain
繰り返されましたね〜!😊基本的には配列オブジェクトと似ているので、このあたりは分かりやすいかと思います。

each_keyメソッドは、要素の中のキーだけをピックアップして繰り返し処理を行います。
対して、each_valueメソッドは要素の中の値だけをピックアップして繰り返し処理を行います。
以下に示すのはeach_keyの書き方ですが、each_valueでも同じ書き方ができます💡

ハッシュ名.each_key{|key|

  実行する処理1   実行する処理2  }

1-6. ハッシュに含まれるキーや値を配列として取得

ハッシュに含まれるキーや値を、配列オブジェクトとして取得することができます。
つまりインデックスで管理する形にできるということですね〜!
キーを取得するkeysメソッド、値を取得するvaluesメソッド、キーと値の両方を取得するto_aメソッドがあります。
書き方は全て同じで、keysメソッドを例に以下に示します。

ハッシュ名.keys

これだけです😆
実際に使ってみました!

gist.github.com

実行結果は以下のとおりです。
f:id:mistyrinth:20181120190736p:plain

ハッシュについては以上です👏