2017-02-16 19 views
-1

Я изучаю perl и просматриваю некоторые старые коды OOP. В pl есть одна строка, вызывающая функцию в файле pm. как

my $id = new ABC::Data::InstallData(); 
my $startMenu = $id->getData('menu'); 

В файле вечера, функции, как показано ниже:

package ABC::Data::InstallData; 

$debug = 1; 
sub getData {        
    my($self, $tag) = @_;     
    #print "----1------$self-----------\n"; 
    #print "----2------$tag-----------\n"; 

    if ($debug && ! defined $self->{$tag}) { 
     $logger->debug("Undefined variable $tag = $self->{$tag}");  
    } 

    if ($debug) { 
     $logger->debug("Exiting ABC::Data::InstallData::getData");  
    } 
    return $self->{$tag};            
} 

Как вы можете видеть, есть две линии печати, которые могут выводить название класса и параметр занесены. Но я не понимаю $self->{$tag} смысл, может кто-то помогает?

+0

Какая часть вы не понимаете? '$ self' - это объект, а ключ, соответствующий' $ tag', является свойством объекта. –

ответ

0
$self->{tag} 

... в данном случае это атрибут класса. Это, по-видимому, метод setter/getter внутри класса. Вот пример этого в действии (подробно):

sub new { 
    my ($class, $arg) = @_; 
    my $self = bless {}, $class; 
    $self->arg($arg); 
    return $self; 
} 
sub arg { 
    my ($self, $arg) = @_; 
    if (defined $arg){ 
     $self->{arg} = $arg; 
    } 
    return $self->{arg}; 
} 

Тогда, когда я использую этот модуль:

my $object = Blah->new(2); 
print $object->arg; 

# you can even access object attributes outside of the 
# documented accessor methods, but it breaks encapsulation, 
# so you just don't do it 

print $object->{arg}; 

Выход:

2 

В сущности, подпрограмма getData() возвращающую значение $self->{tag}, где $self является объектом класса (и является хеш-ссылкой), а tag является атрибутом этого объекта (набитого благословением ed hash reference $self (объект)). Когда вы вызываете его с параметром, $self->{tag} устанавливается, затем возвращается и вызывается без параметра, настройка атрибута не выполняется, и возвращается предыдущее (текущее) значение.

 Смежные вопросы

  • Нет связанных вопросов^_^