Shogo's Blog

Dec 29, 2023 - 1 minute read - perl

PerlにClass構文がやってきた

この記事は、Perl Advent Calendar 2023 24日目の記事(代打)です。 23日目は@doikojiで「【さらばpptxよ】perlとJavaScriptとHTMLで超手軽にスライドを作る」でした。


今年のPerlの重大ニュースといえば 「PerlにClass構文がやってきた」 ことですよね[要出典]。 (※ただしExperimental) Advent Calendar でClassをメインに取り上げることなかったなと思ったので、ちょっと触ってみました。

とりあえず動かしてみる

perlclassの例です。 警告が出ないように no warnings 'experimental::class' で抑制だけしました。

use v5.38;
use feature 'class';
no warnings 'experimental::class';

class My::Example 1.234 {
    field $x;
 
    ADJUST {
        $x = "Hello, world";
    }
 
    method print_message {
        say $x;
    }
}
 
My::Example->new->print_message;

実行すると Hello, world と出力されます。

Hello, world

newの引数を受け取る

My::Example->new には引数を渡すことができます。 Perl 5.38時点では :param field属性を使って、フィールドを初期化できるようです。

use v5.38;
use feature 'class';
no warnings 'experimental::class';

class My::Example 1.234 {
    field $message :param; # new の引数で変更できる
 
    method print_message {
        say $message;
    }
}

my $obj = My::Example->new(message => "Hello World");
$obj->print_message;

パラメーターのバリデーション処理が欲しくなるところですが・・・今のところないみたい?今後に期待ですね。

メソッドの中からメソッドを呼び出す

methodの中から、対象のインスタンスを明示せずに他のメソッドを呼び出すとエラーになります。

use v5.38;
use feature 'class';
no warnings 'experimental::class';

class My::Example 1.234 {
    field $message :param;

    method message {
        return $message;
    }

    method print_message {
        say message; # Cannot invoke method "message" on a non-instance at class.pl line 13.
    }
}

my $obj = My::Example->new(message => "Hello World");
$obj->print_message;

$self という変数で、現在のインスタンスにアクセスできます。

use v5.38;
use feature 'class';
no warnings 'experimental::class';

class My::Example 1.234 {
    field $message :param;

    method message {
        return $message;
    }

    method print_message {
        say $self->message;
    }
}

my $obj = My::Example->new(message => "Hello World");
$obj->print_message;

まとめ

Perlにクラスがやってきました! 実験的な導入ということもあり、本当に基本的なことができるのみですが、大きな一歩を踏み出しました。 今後の発展が楽しみですね。


明日25日目は@shogo82148で「AWS::LambdaがCanada West (Calgary) Regionで利用可能になりました」です。 お楽しみに!

参考