Erlang World


top > data type > tuple

Tuple

タプルとは

タプル(tuple)とは複数個のデータを一つとしてまとめたい時に使用する型です。
タームの集まりを中括弧({})で囲み、タームの間をコンマ(,)で区切ることで利用されます。

{Term1, . . . ,TermN}

タプルの中の要素の数は任意です。無くても構いません。
また、タプルの中にあるタームはどのような型でも構いません。つまり、タプルの中にタプルを入れたり、リストを入れたりしても構わないということです。

例えば、

{apple, orange, peach}
{adam, 24, {july, 29}}
{}

のようにものになります。
上記の例にあるように、タプルの中にタプルを入れることも可能です。

また、タプルの最初の要素に値を入れておくことで、そのタプルが何を表しているのかわかりやすくすることが多いです。
例えば、

{goods,{id,338},{name,apple},{price,200}}

というような具合です。
これはタプルを受け渡しする際に良く利用されます。

タプルから値を取り出す

パターンマッチを使うことによってタプルから値を取り出すことができます。 これは非常によく使う手法ですので覚えておいて下さい。。

1> Goods = {338,apple,200}.
{338,apple,200}

2> {Id,Name,Price} = Goods.
{338,apple,200}

3> Id.
338

4> Name.
apple

5> Price.
200

右辺のタプルの形に添って、左辺のタプルの中に変数が用意されていますね。 そして、右辺のタプルの中にある値と対応が取れる位置にある変数に欲しい要素が抽出されています。

タプルは要素の数で値を取り出します。したがって、要素数が合わないパターンマッチはエラーになってしまいます。

> Tuple = {1,2,{3,4},5}.
{1,2,{3,4},5}
> {A,B} = Tuple.
** exception error: no match of right hand side value {1,2,{3,4},5}

タプル自体もタームなので、そのまま変数に代入することもできます。

> A = Tuple.
{1,2,{3,4},5}

タプルの中に必要でない要素がある場合は無名変数_ 」を使います。 「_」を使うことによって無駄な変数への束縛を避ける(そのまま捨てる)ことができ、負荷を減らすことが可能です。 ただし、変数「_」から値を取り出すことは出来ません。

6> {Id2,_,Price2} = Goods.
{338,apple,200}

7> Id2.
338

8> Price2.
200

9> _.
* 1: variable '_' is unbound

また、「_」から始まる変数(_Num など)は特別な意味を持ちます。 関数を作る際に、通常の変数が利用されていないと注意されてしまいますが、「_」から始まる変数は注意されません。
従って、関数の中で「今は使わないけど、いずれ使うかもしれない」というような変数に利用されることが多いです。

BIF タプルを操作する関数

is_tuple(Term) -> bool()
Term = term()
Termがタプルであればture、違えばfalseを返します。
> is_tuple({hello, [erlang, java]}).
true
element(N, Tuple) -> term()
N = 1..tuple_size(Tuple)
Tuple = tuple()
TupleのN番目の要素を取得する。
> element(3,{hello, i, love ,erlang}).
love
setelement(Index, Tuple1, Value) -> Tuple2
Index = 1..tuple_size(Tuple1)
Tuple1 = Tuple2 = tuple()
Value = term()
TupleのN番目の要素にTermを設定する。
> setelement(3,{i, like, erlang},{erlang, java}).
{i,like,{erlang,java}}
tuple_size(Tuple) -> int()
Tuple = tuple()
Tupleの要素数を得る
> tuple_size({1,2,3,4,5}).
5

> tuple_size({}).
0
erlang:append_element(Tuple1, Term) -> Tuple2
Tuple1 = Tuple2 = tuple()
Term = term()
タプルに値を追加する。
erlang:append_element({one, two}, three).
{one,two,three}
erlang:make_tuple(Arity, InitialValue) -> tuple()
Arity = int()
InitialValue = term()
要素数がIntで、全ての要素がTermのタプルを作成します。
> erlang:make_tuple(4,good).
{good,good,good,good}

BIF 型の変換

tuple_to_list(Tuple) -> [term()]
Tuple = tuple()
Tupleをリストに変換する。
> tuple_to_list({share, {'Ericsson_B', 163}}).
[share,{'Ericsson_B',163}]
list_to_tuple(List) -> tuple()
List = [term()]
Listをタプルに変換する。
> list_to_tuple([share, ['Ericsson_B', 163]]).
{share, ['Ericsson_B', 163]}

Yuichi ITO. All rights reserved.
mail to : ad
inserted by FC2 system