Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Class::Accessor::Liteのプロパティを変な方法で呼び出しても一見動いてしまうの困る

package Foo;
use strict;
use warnings;
use Class::Accessor::Lite(
    new => 1,
    ro => [qw(prop)]
);

sub foo {
  my $self = shift;
  return prop;
}

これはちゃんと動かない。正しくは

package Foo;
use strict;
use warnings;
use Class::Accessor::Lite(
    new => 1,
    ro => [qw(prop)]
);

sub foo {
  my $self = shift;
  return $self->prop;
}

のように、$self->propしないとClass::Accessor::Liteは正しく動作しない。まあこれは常識の範囲内だと思うけど、うっかり間違えてpropと直に書いてしまった。

にもかかわらず、処理系は一応正しく動作してしまう。エラーになるわけでもなく、単にundefを返すだけの振舞いになってしまうようだ。 propと単発で呼び出すと、propが引数無しで呼び出されたときと同じ振舞いになるようだ。

このようなシンプルな例だとすぐ気付けそうだけど、コードベースが複雑だとぜんだん気付かなかったりする。

これで一回ハマって静かにコードが壊れたことがあったので、困るな〜と思った。

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?