1

Class::Structオブジェクトのフィールドをインクリメントするにはどうすればよいですか?

今のところ私は立ち往生しています

use Class::Struct foo => [
  counter => '$',
];
my $bar = foo->new(counter => 5);
$bar->counter($bar->counter()+1);

最後の行よりも表現力のあるものがあるのだろうか (明らかな$bar->counter++結果はCan't modify non-lvalue subroutine call)。

編集:もちろん、私は$bar->[0]++他には興味がありません-前にフィールドを追加するとどうなりcounterますか? そのような「待機中のバグ」をすべてコードで探す必要はありません。

4

2 に答える 2

6

increment次のメソッドを追加できますfoo

#!/usr/bin/env perl

package foo;

use strict; use warnings;

sub increment_counter {
    my $self = shift;
    my $val = $self->counter + 1;
    $self->counter($val);
    return $val;
}

package main;

use 5.012;
use strict;
use warnings;

use Class::Struct foo => [
  counter => '$',
];

my $bar = foo->new(counter => 5);

$bar->increment_counter;

say $bar->counter;

__END__
于 2013-04-03T22:37:37.217 に答える
1

または、これを試してください:

use strict; use warnings;

use Class::Struct foo => [
  counter => '$',
];
my $bar = foo->new(counter => 5);
print ++$bar->[0];

または SCALAR ref を使用します (前のスニペットのように「パス」をハードコーディングする必要はありません):

use strict; use warnings;

$\ = "\n";

use Class::Struct foo => [
  counter => '*$',
];
my $bar = foo->new(counter => 5);
print ++${ $bar->counter };
于 2013-04-03T22:07:07.393 に答える