こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はタプルとは何かについて学んだことをまとめます。
目的
タプルとは何かについて理解する
実行環境
Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.17.3
Erlang v27.0
タプルとは
複数の値を保持するデータ構造。{}
で囲みます。
メモリ内に連続して格納されるため、リストと比較してはタプルの長さや値の取得を高速で取得できます。1
タプルの使いどころ
上記の定義から、タプルは要素の読み取りには向きますが、要素の追加や変更には不向きです。
タプルのパターンマッチ
tuple = {:ok, :example} # タプルの作成
{:ok, atom} = tuple # タプルのパターンマッチ。変数atomに:exampleをバインドする
{:ok, :example}
タプルの要素の追加/変更をしたい場合
タプルの要素の追加/変更をしたい場合、既存のタプルに変更を加えるのではなく新しくタプルを作成します
良い例
result = {:ok, atom, %{}} # 上記のパターンマッチの結果を引き継いで新しいタプルを作成
{:ok, :example, %{}}
悪い例
result = Tuple.insert_at(tuple, 2, %{}) # 既存のタプルに変更を加える
{:ok, :example, %{}}
タプルのパターンマッチ+後続のデータ処理
実行結果に{:ok, 結果}
あるいは{:error, エラーの理由}
のタプルが来る関数は、タプルのパターンマッチを利用して要素を取り出し、後続のデータ処理につなげられます。
タプルの使い方としては頻出です。
例
"Hello, World!"を大文字にして"hoge.txt"を更新し、それを読み取ります。
"hoge.txt"の作成+更新前のデータ確認
実行結果が{:ok, 結果}
の形をしているのでタプルのパターンマッチを使うことを考えます。
defmodule Fililr do
def make_a_file do
body = "Hello, World!"
File.write("hoge.txt", body)
File.read("hoge.txt")
end
end
Fililr.make_a_file()
{:ok, "Hello, World!"}
タプルのパターンマッチ
"Hello, World!"
を変数txt
にバインドします。
{:ok, txt} = Fililr.make_a_file()
{:ok, "Hello, World!"}
タプルから取り出した要素を後続のデータ処理に渡す
txt
|> String.upcase()
|> then(fn x -> File.write("hoge.txt", x) end)
:ok
更新後のデータ確認
"Hello, World!"が大文字になっていることが確認できます。
File.read("hoge.txt")
{:ok, "HELLO, WORLD!"}
~Elixirの国のご案内~
↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます
↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。
↓We Are The Alchemists, my friends!2
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。3
-
『Elixir実践入門』P47,48 ↩
-
@torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。 ↩