前回の
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'); # errorduck_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



