2016年4月20日水曜日

Rubyでハッシュキーにシンボルを使った場合、代入式を短縮できる。

Chefのレシピをメンテしていて、Rubyのよく分からないものの一つにシンボルがあります。

で、これ、ハッシュ配列と組み合わせると、初心者にはよくわからないものになります。

a = { :A => "a", :B => "b"}

これは、シンボル:Aにaを代入しています。これはまぁOK。

a = { A: "a", B: "b"}

=>が消えまして、そのかわり前にあったコロンが後ろにつきます。
これは、=>を短縮したものなんですが、前にコロンが付くものがシンボルと思っていると訳が分からなくなります。

これの値を取り出すのは、 a[:A]になります。

ハッシュ配列に似たもの?として、構造体があります。
構造体はC言語の授業でならった人も多いと思います。

a = Struct.new(:ID,:Name)
rec = a.new(123,"taro")
pp rec.ID
みたいな感じで使います。
組み合わせて、ハッシュ配列に構造体を入れたり、配列を入れたりできます。
個人的には、a.bみたいな感じで値を取り出せる構造体が好みなんですが、Ruby的にはハッシュ配列が良いようですね。いろんなコード見ていますと。
(まぁ構造体だとメソッドとパッと見区別がつきにくい。てのがあるのかも)

最後に、Chefのレシピをメンテしていて、

a = {a: "a",b: "b}"
pp a.fetch(:a)

のようなコードを見て、なんでa[:a]じゃないんだろ?と疑問に思い調べてみました。
[]の場合、キーが存在しない場合、nilが帰ってきて、例外になりませんが、fetchの場合、key not found例外が発生します。
きちんと例外処理をしたい個所では使い分けないとなと思います。

参考:Rubyのややこしい配列とハッシュとシンボルについて整理してみた



0 件のコメント:

コメントを投稿