5

私はこれをどのように行うのか疑問に思っています:

package Something;
our $secret = "blah";

sub get_secret {
    my ($class) = @_;
    return; # I want to return the secret variable here
}

今私が行くとき

print Something->get_secret();

印刷したいblah。を使用するように指示する前に、派生クラスがベースとして使用する場合は、そのクラスのシークレットを取得する必要がある$secretことを確認したいと思います。Somethingget_secret

を使用してパッケージ変数をどのように参照します$classか?使用できることはわかっていますevalが、もっとエレガントな解決策はありますか?

4

2 に答える 2

5

$secretパッケージ内で変更可能であるはずですか? そうでない場合は、変数を削除して、代わりにクラス メソッドに値を返すようにすることができます。異なるシークレットが必要なクラスは、シークレットの値を変更する代わりに、メソッドをオーバーライドします。例えば:

package Something;

use warnings; use strict;

use constant get_secret => 'blah';

package SomethingElse;

use warnings; use strict;

use base 'Something';

use constant get_secret => 'meh';

package SomethingOther;

use warnings; use strict;

use base 'Something';

package main;

use warnings; use strict;

print SomethingElse->get_secret, "\n";
print SomethingOther->get_secret, "\n";

それ以外の場合、perltoocにはさまざまなシナリオに適合する便利なテクニックが含まれています。あなたのニーズに合うように見えるClass::Data::Inherableperltoocを指します。

于 2011-05-04T14:40:00.633 に答える
3

シンボリック参照を使用できます:

no strict 'refs';
return ${"${class}::secret"};
于 2011-05-04T08:30:09.677 に答える