Свойства статического класса Perl - PullRequest
10 голосов
/ 04 апреля 2011

Как я знаю, создание динамических экземпляров класса (пакета) похоже на взлом синтаксиса Perl (с использованием 'bless').Perl не поддерживает ключевое слово под названием «класс»;таким образом, все ограничено.

Первое ограничение Perl, которое вызывает трудности в ООП, - это создание свойств статического класса и методов статического класса .Любое решение?

Ответы [ 4 ]

17 голосов
/ 04 апреля 2011

Для переменных уровня класса есть два обычно используемых подхода:

package Bar;
use strict;
use warnings;

sub new { bless {}, shift };

# (1) Use a lexical variable scoped at the file level,
# and provide access via a method.
my $foo = 123;
sub get_foo { $foo }

# (2) Use a package variable. Users will be able to get access via
# the fully qualified name ($Bar::fubb) or by importing the name (if
# your class exports it).
our $fubb = 456;

Пример использования:

use Bar;

my $b = Bar->new;
print "$_\n" for $b->get_foo(), $Bar::fubb;
7 голосов
/ 04 апреля 2011

В наше время, если вы действительно хотите сделать ООП с Perl, вам будет разумно использовать инфраструктуру объектов, такую ​​как Moose , которая поможет очистить синтаксис.Это сделает работу OO в Perl более болезненной, и если вы используете расширения, такие как MooseX :: Declare, это будет еще слаще.

Я не делаю много OO, но ямне кажется, я знаю, что ты пытаешься сделать, и я верю, что Мус может сделать это прямо вперед.

0 голосов
/ 04 апреля 2011

Стандартная переменная пакета ведет себя как переменная класса

package foo;

my $bar;

1;

тогда:

$foo::bar=1;  # or whatever
$foo::bar++;
print $foo::bar, "\n";
0 голосов
/ 04 апреля 2011

Я нашел решение:

package test;

my $static_var = undef;

#constructor not needed

#static method to set variable
sub set_var {
    my ($value) = @_;
    $static_var = $value;
}

#static method to get variable value
sub get_var {
    return $static_var;
}

1;

Согласно http://www.stonehenge.com/merlyn/UnixReview/col46.html, не представляется возможным получить доступ к этим переменным в пакете напрямую. Может быть, должны быть get, set методы для доступа к ним.

Как сказано в вышеприведенной статье:

Нет также синтаксиса, который позволял бы любому другому коду вне этого кода обращаться к этим переменным, поэтому мы можем быть уверены, что наши переменные не будут изменяться таинственным образом.

Я действительно не знаю, прав ли этот автор.

...