Re: use fields; と my TYPE EXPR;
これ、コンパイル時チェックというのはあってますが、実効速度が遅いというのは誤解です。
use fields; と my TYPE EXPR; - 日々量産
fieldsを使うと、フィールドに不正な代入があったら、"コンパイル時"にはじくことが出来る。
ハッシュキーをよくtypoする人にはおすすめだが、実行速度は遅い。
typed myはコンパイル時にしか効果を及ぼさないので実行速度へのペナルティはありません*1。件のベンチマークでスコアが出ないのでは、fields::new()
が遅いからですね。fields::new()
の意味は、5.10.0より前のバージョンとの互換性のためと、実行時チェックのためのHash::Util::lock_keys()
の適用です。5.10.0以上限定で実行時チェックが不要なら使う必要はありません。
コンパイル時チェックというのは次のようなことです。
package Foo; use strict; use fields qw(bar); sub m { my Foo $value = 42; return $value->{baz}; # コンパイルエラー }
$valueに入っているのはハッシュリファレンスではないのでtyped myがなくても実行時に型違いでエラーになりますが、typed myを使うとコンパイル時にチェックが走り宣言していないフィールドにアクセスしたというエラーを発生させます。
このfieldsの恩恵を受けるにはtyped myを使わなければならず、これが煩わしいのが欠点ですね。
また、fieldsで宣言したフィールドはbaseプラグマを使わなければ継承できないのも厄介です。使うとしても、単純なクラスの開発段階だけで留めておいたほうが無難でしょう。
*1:これは5.10.0以降の話で、5.8.xだと実行速度が少し遅くなります。