一旦まとめよう
- 一般的なスクリプト言語での配列は、elixirではタプルを使う
- タプルは大体4~5個の要素で使うことが多い
- タプルはインデックスを指定して要素を抜き出すことができる(elem/2)
- タプルは連続した状態でメモリに格納されるので処理が速い
- elixirのリストは一般的な配列ではない
- リストはHeadとTailという2つの要素で構成されている
- Headは1つの値、Tailはリストで構成されている
- リスト内の連続した値はこの構造の入れ子になっている
- 特定のインデックスの値を取得する関数は無い
- 何に使うのか不明
正直、このリストってのが何のためにあるのかが分かってないが、おそらくelixir流のスクリプトを書いていくうちに、『お、ここはリストを使うべきだな』ってなるともうので、今の時点ではこれ以上深く突っ込まないようにする。
キーワードリスト
実はこのタプルとリストを組み合わせ、PHPでいう連想配列のようなものが作れる。
PHPでこんな配列があったとする。
1 2 3 4 5 6 7 8 |
$arr = [ 'id' => 'ogaaaan', 'name' => 'おがーん', 'state' => 'dude', 'job' => '掘削' ]; print_r($arr); |
当然こんな結果になる。
1 2 3 4 5 6 7 8 |
Array ( [id] => ogaaaan [name] => おがーん [state] => dude [job] => 掘削 ) |
これをelixirで、リストとタプルを使って実現できるらしい。やってみよう。
1 2 |
iex> [ {:id, "ogaaaan" }, {:name, "おがーん" }, {:state, "dude" }, {:job, "掘削" } ] |
PHPでいうところのkeyとvalueを1つのタプルで作り、それをリストでいくつも並べるだけ。
keyはアトムで記述すると。なるほど、なんとなく分かった気がする。
そしてこれを実行すると!!
1 2 |
[id: "ogaaaan", name: "おがーん", state: "dude", job: "掘削"] |
なんということでしょう!!
匠の力でリスト内のタプルがスッキリ・シャッキリ・ポッキポキ!に変貌を遂げたのです!!
(;´Д`)ハァハァ
と言うよりなんだこの初めてのフォーマット!
というわけで、このフォーマットそのまま打ち込んで見る。
1 2 3 |
iex> [id: "ogaaaan", name: "おがーん", state: "dude", job: "掘削"] [id: "ogaaaan", name: "おがーん", state: "dude", job: "掘削"] |
ムホ!
要するにこういう形で最初から指定ができるのか。なるほど。
elixirはカッコを省略できるケースが多いので、おそらくそういうことなんだろうな。
keyとvalueがコロンで区切られてるのはすごくわかりやすい。
サンプルコード
サンプルだと、DBに保存する際にリスト形式で保存していた。
1 2 |
DB.save record, [ {:id, "ogaaaan" }, {:name, "おがーん" }, {:state, "dude" }, {:job, "掘削" } ] |
あ、そうか、そういうことか。
これからDBにinsertするデータとか、リストにしておくとわかりやすいか。リストの使い方が1個わかった。
で、カッコを省略してみると、なんとこういう書き方も出来てしまう。
1 2 |
DB.save record, id: "ogaaaan", name: "おがーん", state: "dude", job: "掘削" |
なにこれ!
カッコがないだけで丸裸!丸見え!!
なんだか雨降ること全く考慮してない海外のホテルみたいじゃん。いいね!!
なんだかこういう荒々しくもテキトーっぽいんだけど実は研ぎ澄まされてて無駄がないのってステキゾーン。
ちなみにリストの途中で省略表記しても大丈夫らしい。
1 2 3 |
iex> [1, 2, three: 3] [1, 2, {:three, 3}] |
これは便利かも。
でもこれはエラーになる。
1 2 3 |
iex> [1, 2, three: 3, 4] ** (SyntaxError) iex:3: syntax error before: 4 |
これはなんでかというと、省略表記したあとに省略表記してない値(この場合4)がある場合は無効になるらしい。
最後に連続して省略表記されていればOKなので、
1 2 |
iex> [1, 2, three: 3, four: 4] |
これはOKになる。
1 2 |
[1, 2, {:three, 3}, {:four, 4}] |
おわり
次回は同じくコレクション系で、マップをやろうかな。