この記事は、Perl Advent Calendar 2025 23日目の記事です。 22日目は@shogo82148で「Perlのフィールド変数の:writer属性を試してみる」でした。
背景
ネタが尽きてきたので、引き続きperldeltaから頑張ってネタを探すシリーズをやっていこうと思います。
クラスにレキシカルメソッドが実装されたらしいので、これを試してみます。
レキシカルメソッドの使い方
perlclass からの例です。 class機能はまだ実験的な機能扱いなので、機能の有効化と、警告の無効化が必要なことに注意してください。
use v5.42;
use utf8;
use feature 'class';
no warnings 'experimental::class';
class LexicalMethod {
my method abc ($x, $y) {
say "Internal method abc invoked with x=$x y=$y";
}
method xyz {
$self->&abc("x", "y");
}
}
my $obj = LexicalMethod->new();
$obj->xyz();
# エラーになる例:
$obj->abc("hello", "world");
実行すると以下のような結果が得られます:
Internal method abc invoked with x=x y=y
Can't locate object method "abc" via package "LexicalMethod" at ./my-method.pl line 20.
レキシカルメソッドは現在のスコープ内からのみ参照できます。
これを使うことで他の言語で言うところのプライベートメソッドを実現できます。
スコープ内から呼び出すときは $self->abc ではなく、 $self->&abc になる点に注意が必要そうですね。
さきほどの実行例から、実際にスコープ外がアクセスしようとすると「そんなメソッドは定義されてないよ」と怒られてエラーになることがわかります。
まとめ
Perl 5.42.0に導入されたレキシカルメソッドで遊んでみました。 class機能自体がまだ実験的機能の扱いなので、レキシカルメソッドにも変更が入る可能性があります。 利用する人は注意してください。
明日24日はTBDさんでTBDです。
ぼくはウサギ、コード畑で跳ねるよ 🐇
字句的メソッド、内緒の扉を覗くよ 🔐
クラスの中でこっそり歌うメロディ、
記事になって光る夜明け、
新しい一行に耳をすますよ ✨by CodeRabbit