質問
だって学ぶ 提携.いという名前のクラスにリンクを紹介しちゃいたいと思いま、以下のもの:
- 場合は裏を返しますリンクのアドレス
- が格納され、店舗の新しいアドレス
- を呼び出すことができる方法で
これまで、私のコード:
package Link;
sub FETCH {
my $this = shift;
return $this->{"site"};
}
sub STORE {
my ($self,$site) = @_;
$self->{"site"} = $site;
}
sub print_method {
my $self = shift;
print $self->{"site"};
}
sub TIESCALAR {
my $class = shift;
my $link = shift;
my $this = {};
bless($this,$class);
$this->{"site"} = $link;
return $this;
}
1;
このコードを使用しているチェックの機能は:
use Link;
tie my $var,"Link","http://somesite.com";
$var->print_method;
実行した場合、スクリプト終了すると以下のようなエラー:できない呼び出し方"print_methodなパッケージまたはオブジェクト参照でtietest.pl ライン4..
がわかれば、そのメッセージを正しく $var->print_method
を解決する一部の文字列による方法 print_method
が呼び出されます。どのようにしたら良いですから、も利用の変数オブジェクトとして?
編集:後の実験エリアをクリックしていることが分かった場合に戻したい$自に取得までの手法が取得さんを返します。
編集2:perl僧提供を求 つ .結び方があります。への参照オブジェクトに変更します。
を組み合わせくは私のやり方で、私を達成することができるものがあります。
解決
タイはこの仕事のために間違ったツールです。あなたは、通常のデータ型と同じインタフェースをしたいが、操作は自分の仕事を行う方法をカスタマイズしたいときは、ネクタイを使用しています。あなたはすでに、ネクタイはあなたのために何もしないんだけスカラーのような文字列にアクセスし、保存したいので。
これはおそらくあなたが URI のモジュール、またはそのサブクラスをしたいように見える、といくつかのオーバーロードます。
あなたが本当にこれを実行する必要がある場合は、、あなたは右の変数を使用する必要があります。 ネクタイのはあなたが指定したクラスに指定する変数をフックし、それはまだです通常のスカラー(およびない参照)。あなたがメソッドを呼び出したい場合は、それが返すオブジェクトを使用する必要があります:
my $secret_object = tie my($normal_scalar), 'Tie::Class', @args;
$secret_object->print_method;
あなただけ縛らスカラを持っている場合は、また、秘密のオブジェクトを取得することができます:
my $secret_object = tied $normal_scalar;
私はマスタリングのPerl の中でタイの章全体を持っています。
他のヒント
私は、文字列化をINGの通常のPerlのオブジェクトを作成してから過負荷を示唆しています。あなたは割り当てて値を格納するための能力を失うが、オブジェクトを印刷することで値を取得する能力を保持します。あなたが直接メソッドを呼び出すしたい開始すると、オブジェクトが何をしたいと考えられます。
package Link;
use strict;
use Carp;
use overload
(
'""' => sub { shift->site },
fallback => 1,
);
sub new
{
my $class = shift;
my $self = bless {}, $class;
if(@_)
{
if(@_ == 1)
{
$self->{'site'} = shift;
}
else { croak "$class->new() expects a single URL argument" }
}
return $self;
}
sub site
{
my $self = shift;
$self->{'site'} = shift if(@_);
return $self->{'site'};
}
sub print_method
{
my $self = shift;
print $self->site, "\n";
}
1;
使用例:
use Link;
my $link = Link->new('http://somesite.com');
print $link, "\n"; # http://somesite.com
$link->print_method; # http://somesite.com
あなたは本当に、本当に割り当てがあまりにも仕事をしたい場合は、あなたがLink
とオーバーロードされた文字列化(上記tie
、)で通常のオブジェクトを組み合わせることができます:
package LinkTie;
use strict;
use Link;
sub FETCH
{
my $this = shift;
return $this->{'link'};
}
sub STORE
{
my($self, $site) = @_;
$self->{'link'}->site($site);
return $site;
}
# XXX: You could generalize this delegation with Class::Delegation or similar
sub print_method
{
my $self = shift;
print $self->{'link'}->print_method;
}
sub TIESCALAR
{
my $class = shift;
my $self = bless {}, $class;
$self->{'link'} = Link->new(@_);
return $self;
}
1;
使用例:
tie my $link,'LinkTie','http://somesite.com';
print $link, "\n"; # http://somesite.com
$link->print_method; # http://somesite.com
$link = 'http://othersite.com';
print $link, "\n"; # http://othersite.com
$link->print_method; # http://othersite.com
これは、すべての非常に恐ろしいし、ちょうどあなたも上のメソッドを呼び出してもそのまま印刷することができます何かに割り当てる怪しげな能力を得るためには長い道のりです。文字列化と標準のURIオブジェクトは、おそらくより良い賭けである。