• このエントリーをはてなブックマークに追加


はじめに

これの続き.

PrePAN でいただいたコメント(ポジティヴなニュアンスであると解釈していいよね?) の中に何気に $foo="az" とかあって,やっぱりこういう使い方できた方がいいよね,と思ってたので,overload モジュールでできるかと思いきや,そうも行かない感じになってきて

などとぼやいたところ(よく見たら “use” でなくて “user” になってるなw),lestrrat さんから

というアドヴァイスが.まぁオススメされてませんがw

とりあえず実装してみた

とりあえず実装すべく.

そういえば, tie とか触ったことなかったので,

をはじめどういったことができるものなのか,から少し調べてました.

で,実装した差分がこれになります:

これにより,次のようなことができるようになりました:

use String::Incremental;
 
tie my $str, 'String::Incremental', ( format => '%2=', orders => [ 'abc' ] );
print "$str";  # -> 'aa';
 
$str = 'bc';   # same as `$str->set( 'bc' )` <- ココ!
print "$str";  # -> 'bc'
 
$str++;
print "$str";  # -> 'ca'

まぁ メソッド ->set() を簡略化できるだけですね.

この実装を始めた頃,

sub tied_constructor {
    my ($class, @args) = @_;
    tie my $tied, 'String::Incremental::Tied', @args;
    return $tied;
}

みたいなものを準備して,呼ぶ側では tie を書かずに済むようにしたかったのですが,どうやらその戻り値は tie されていないご様子.そのへん調べきれていないので,現段階では先のような実装になってしまいました.

あと,この変更で $str++$str-- の挙動にも影響が出たため,元のテストが pass するよう,(ヒューリスティックな感じで)SOTORE メソッドを調整しています><

おわりに

少し前に書いた CPAN 未満モジュール String::Incremental に変更を加えて,tie したときには,代入感覚でメソッド ->set() を呼び出せる ようにしてみたお話でした.