sironekotoroの日記

Perl で楽をしたい

Mouseのコンストラクタで1時間ちょっとハマったところ

出オチ感がるんですが、こんなコードです。

Mouse を使った Perlオブジェクト指向のコードです。

意図したことは、$obj = UserID->new() でコンストラクタを呼ぶも、 required => 1 つまりオブジェクト生成時にプロパティを必須にしているのでエラーが出る・・・というものです。

#!/usr/bin/env perl
package UserID {
    use Mouse;

    has user_id => (
        is  => "rw",
        isa => "Str",
        default  => "",
        required => 1,
    );

    __PACKAGE__->meta->make_immutable();
}

package main;
use strict;
use warnings;

my $obj = UserID->new();

が、エラー出ません。

Google 翻訳片手にオフィシャルのページ読んでみたりしたのですが、解決せず。

metacpan.org

で、原因なんですが、ここです。

        default  => "",
        required => 1,

ここで、required => 1 としてオブジェクト生成時にプロパティを要求する・・・のと同時に、 default => "", と、何も指定されなかったときにデフォルト値が入る設定にしていました。

ということで、当初の意図通りオブジェクト生成時にプロパティを要求したいときには default => "", の行を消せば ok です。