前回の
Mouse::Util::TypeConstraintsで独自の型を定義する
(1)
Mouse::Util::TypeConstraintsは、cpanm
でインストールすることで利用できます。cpanm
コマンドでインストールし、
$ cpanm Mouse
$ perl -MMouse -E 'say $Mouse::VERSION'
独自の型を定義するユーティリティはいくつもあるため、
subtypeを使った既存の型の拡張
subtype
を利用すれば、subtype
はDSL
- as
- どの型から派生するか
- where
- その型が満たすべき制約。Perlのコードであればどんなものでも書ける。書いたコードが真を返せば制約を満たし、
偽を返せば制約を満たさない型を定義できる - message
- 制約を満たさなかった場合のエラーメッセージ
次のコードは、Natural
型を定義するコードです。
use Mouse::Util::TypeConstraints;
use Smart::Args;
// (1)型定義
subtype 'Natural'
=> as 'Int'
=> where { $_ > 0 }
=> message { "This number($_) is not Natural" };
sub func {
args my $p => 'Natural';
}
func(p => 3); ━(2)
func(p => -1); ━(3)
func(p => 'aiueo'); ━(4)
subtype
を用いて型を定義します。where
とmessage
の中では$_という変数が利用でき、message
で定義した'p': This number(-1) is not Natural
が出力され、Natural
が継承しているInt
型ですらないので、
Natural
型からさらに派生し、NaturalLessThanFive
の定義もできます。
use Mouse::Util::TypeConstraints;
subtype 'NaturalLessThanFive'
=> as 'Natural'
=> where { $_ < 5 }
=> message { "$_ is not less than five" };
where
にはPerlのコードならどんなものでも書けるので、EmailAddress
を定義できます。CPANで公開されているEmail::Valid::Looseモジュールを使って次のように書きます。
use Mouse::Util::TypeConstraints;
use Email::Valid::Loose;
subtype 'EmailAddress',
=> as 'Str'
=> where {
Email::Valid::Loose->address(-address => $_)
}
=> message { "$_ is not a valid email address" };
enumを使った型の定義
関数の引数に対して、
次のコードは、red
)・blue
)・green
)
use Smart::Args;
use Mouse::Util::TypeConstraints;
enum 'RGBColor' => ['red', 'blue', 'green'];
sub func {
args my $p => 'RGBColor';
}
func(p => 'red'); # ok
func(p => 'black'); # error
duck_typeを使った型の定義
duck_
を利用すると、
次のコードは、id
メソッドとas_
メソッドの両方を持つクラスのオブジェクトを受け入れる型を定義する例です。
use Mouse::Util::TypeConstraints;
duck_type 'HasIdAndAsStringMethod' => [qw(id as_string)];
型を定義するときの注意点
独自の型を定義する際、
ドキュメントによると、Blog
パッケージでブログが取り得る状態を型として定義するなら、Blog::Status
という名前で定義します。
package Blog;
use Mouse::Util::TypeConstraints;
enum 'Blog::Status' => [qw(public private)];
<続きの
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT