Доступ к переменным класса с помощью переменной с именем класса в perl - PullRequest
5 голосов
/ 04 мая 2011

Мне интересно, как бы я поступил так:

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, я хочу убедиться, что если производный класс использует Something в качестве базы и я вызываю get_secret, я должен получить секрет этого класса.

Как вы ссылаетесь на переменную пакета, используя $class? Я знаю, что могу использовать eval, но есть ли более элегантное решение?

Ответы [ 2 ]

5 голосов
/ 04 мая 2011

Должен ли $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 содержит полезные приемы для соответствия различным сценариям.perltooc указывает на Class :: Data :: Inheritable , который соответствует вашим потребностям.

3 голосов
/ 04 мая 2011

Вы можете использовать символьную ссылку :

no strict 'refs';
return ${"${class}::secret"};
...