2006 年 4 月 8 日 21 時 45 分

代入可能なメソッド


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


lvalue が任意のサブルーチンに使えるということは、
クラスインスタンスのメソッドとしても使えるということだ。

理由は、Perl におけるメソッドが、
単に、クラスの名前と同じパッケージに定義された、
サブルーチンであるからである。

サブルーチンをメソッドとして使う場合、
暗黙に一つ目の引数としてインスタンスが渡される。
それだけの差なのだ。

では、前に作った Employee クラスの、
salary メソッドに lvalue を適用してみよう。

========== Employee.pm ==========

package Employee;

use v5.6.1;
use strict;
use warnings;

BEGIN {
    our $Version = '0.03';
}

sub new {
    my ($package, %identity) = @_;
    $package = (ref $package or $package or __PACKAGE__);
    bless(\%identity, $package);
}

sub name {
    $_[0]->{'name'};
}

sub gender {
    $_[0]->{'gender'};
}

sub weight {
    $_[0]->{'weight'};
}

sub salary : lvalue {
    $_[0]->{'salary'};
}

1;

========== end of Employee.pm ==========

Perl のサブルーチンでは、return 文を使わなくとも、
ブロックの一番最後の式の評価結果が、戻り値となる。
そのため、salary 以外のルーチンも
return を省略して記述することができるのだ。

では、Jack の給料を上げてみよう。

========== EmployeeTest.pl ==========

#!/usr/local/bin/perl

use strict;
use warnings;
use lib '.';
use Employee;

my $jack = Employee->new(
    'name'  => 'Jack',
    'gender' => 'male',
    'salary' => 160000,
    'weight' => '65kg',
);

$\ = "\n";

print "Salary: ", $jack->salary;

$jack->salary = 200000;

print "Salary: ", $jack->salary;

========== end of EmployeeTest.pl ==========

実行してみる。

$ ./EmployeeTest.pl
Salary: 160000
Salary: 200000

どうだろうか。プロパティとしての構文が達成できた。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.