これはMoritz Lenz氏のWebサイトPerlgeek.deで公開されているブログ記事"Perl 5 to 6" Lesson 16 - Enumsの日本語訳です。
原文はCreative Commons Attribution 3.0 Germanyに基づいて公開されています。
本エントリにはCreative Commons Attribution 3.0 Unportedを適用します。
Original text: Copyright© 2008-2010 Moritz Lenz
Japanese translation: Copyright© 2011 SATOH Koichi
NAME
"Perl 5 to 6" Lesson 16 - 列挙型
SYNOPSIS
enum bit Bool <False True>;
my $value = $arbitrary_value but True;
if $value {
say "Yes, it's true"; # 表示される
}
enum Day ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
if custom_get_date().Day == Day::Sat | Day::Sun {
say "Weekend";
}
DESCRIPTION
列挙型は用途の広い獣です。定数の列挙からなる低レベルのクラスであり、定数は典型的には整数や文字列です(が任意のものが使えます)。
これらの定数は派生型やメソッド、あるいは通常の値のようにふるまいます。
but
演算子でオブジェクトに結びつけることができ、これによって列挙型を値に「ミックスイン」できます:
my $x = $today but Day::Tue;
列挙型の型名を関数のように使うこともでき、引数として値を指定できます:
$x = $today but Day($weekday);
こうするとオブジェクトは列挙型の名前(ここではDay
)をメソッド名として持ちます:
say $x.Day; # 1
最初の定数の値は0
、その次は1
と続きます。ただしペア記法を使って明示的に別の値を指定した場合は別です:
Enum Hackers (:Larry<Perl>, :Guido<Python>, :Paul<Lisp>);
ある値がミックスインされているかどうかはスマートマッチ演算子や.does
メソッドで調べることができます:
if $today ~~ Day::Fri {
say "Thank Christ it's Friday"
}
if $today.does(Fri) { ... }
曖昧性がない場合、(Fri
のように)値の名前だけを与えれば良いことを覚えておいて下さい。
曖昧な場合は完全な名前であるDay::Fri
を与える必要があります。
MOTIVATION
列挙型はPerl5の汚染変数に関する「マジック」と(数値として使われた時に警告が出ないよう特別扱いされている)"0 but true"
を返すハックの両方を代替します。加えて真理値(Bool
)型も提供します。
列挙型はデバッグやトレースのために任意のメタデータを付加する柔軟性と能力をも提供します。
コメント
コメントを投稿