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入門の解説が難しかったので、こちらのサイトを参考にさせていただきました!
サイトの解説を真似して実際にやってみました。
※respond_to?
メソッドについて詳しいことはまだよく分かりませんが、if文の意味は「キーのオブジェクトに*(掛け算)の演算子があれば、2を掛けた結果を値として保存する」ということらしいです。
掛け算の演算子が使えるのは数値と文字列だったと思います💡
実行結果は以下のとおりです。
細かいことはさておき、{ }
の中のハッシュ、キー、ブロックという構造が分かったので先に進みます😇
次は、クラスメソッドの[ ]
を使った例です。
`Hash[ハッシュ名]`
引数(ハッシュ名)に、他のハッシュオブジェクトを指定することができます!
ハッシュオブジェクトをコピーする感じですね。このとき、コピー元とコピー先のハッシュが参照するオブジェクトは同一になります。
1-3. デフォルトの設定
これまでに紹介した中で何度か、存在しないキーを指定したときのデフォルトの戻り値についての説明がありました💡
さらっと進めてしまったので復習ですが、大きく分けて以下の2つです。
- fetchメソッドを使った設定方法
- newメソッドを使った設定方法
fetchメソッドを使う時はハッシュオブジェクト名.fetch(キー,デフォルトの戻り値)
でした。
newメソッドを使うときはHash.new(デフォルトの戻り値)
や、ブロック{ }
を使った方法がありました👀
デフォルトの戻り値を設定する方法は、他にもう1つあるので紹介します!
default
メソッドを使った方法です。
ハッシュオブジェクト名.default = デフォルト値
これが一番見た目上簡単な気がしますね😗
1-4. 要素の追加と値の変更
既存のハッシュオブジェクトに対して、要素を追加したり値を変更することができます!
ハッシュオブジェクト[キー] = オブジェクト
そのままですね😊😊
また、store
メソッドというものもあります。
ハッシュオブジェクト名.store(キー,値)
既存のキーを指定すれば、値が上書きされます。存在しないキーを指定すれば、新しくキーが作成されます✨
これだけ見るとシンプルなのに、さっきまでデフォルトの戻り値について学習してたせいかちょっと混乱してきますね😂
以下にサンプルのプログラムを書きました!
結果は以下のとおりです。
1-5. ハッシュのサイズの取得
ハッシュのサイズを取得するには、length
メソッド(別名:size
メソッド)が使えます。
配列オブジェクトの時と同じですね〜✨
ハッシュオブジェクト名.length
書き方も配列の時と同じなので、サンプルプログラムは割愛します😇
参考記事:Ruby入門 part5
1-6. ハッシュに対する繰り返し
ハッシュに対して繰り返しを使うこともできます。
まずはeach
メソッド(別名:each_pair
メソッド)です。
ハッシュ名.each{|key, value|
実行する処理1
実行する処理2
}
ここではkey
とvalue
は他の文字列を使っても良いですが、ハッシュに格納されている要素のそれぞれのキーと値を指しているので、そのままの文字を使ったほうがわかりやすいと思います。
書き方だけ見るとちょっと想像しにくいのですが、例えば以下のように使うことができます!
key
とvalue
が任意の文字列を指していることがわかるように、ここではそれぞれke
とvalu
と名付けてみました。
結果は以下のとおりです。
繰り返されましたね〜!😊基本的には配列オブジェクトと似ているので、このあたりは分かりやすいかと思います。
each_key
メソッドは、要素の中のキーだけをピックアップして繰り返し処理を行います。
対して、each_value
メソッドは要素の中の値だけをピックアップして繰り返し処理を行います。
以下に示すのはeach_key
の書き方ですが、each_value
でも同じ書き方ができます💡
ハッシュ名.each_key{|key|
実行する処理1 実行する処理2 }
1-6. ハッシュに含まれるキーや値を配列として取得
ハッシュに含まれるキーや値を、配列オブジェクトとして取得することができます。
つまりインデックスで管理する形にできるということですね〜!
キーを取得するkeys
メソッド、値を取得するvalues
メソッド、キーと値の両方を取得するto_a
メソッドがあります。
書き方は全て同じで、keys
メソッドを例に以下に示します。
ハッシュ名.keys
これだけです😆
実際に使ってみました!
実行結果は以下のとおりです。
ハッシュについては以上です👏