Как использовать Bless Operator в Perl?

Может кто-нибудь, пожалуйста, объясните важность и как использовать благословение в Perl. Я прочитал много потоков о переполнении стека на благословение, но они не ясны.

3 ответа

Это способ заставить Perl обрабатывать пакеты как объектно-ориентированные классы, а благословенные объекты - как экземпляры этих классов.

Благословение ссылки помечает ее так, чтобы интерпретатор знал, с каким пакетом он связан. Например, если вы напишите:

$x = {}; bless $x, "somepackage";

Тогда вы можете позже написать:

$x->method(1, 2, 3);

И переводчик будет относиться к этому как:

somepackage::method($x, 1, 2, 3);

Вот очень простой пример. Создайте класс в файле с именем MyClass.pm:

package MyClass;

sub new {
   my ($class_name) = @_;
   my $new_instance = {};
   bless $new_instance, $class_name;
   return $new_instance;
}

sub set {
   my ($self, $name, $value) = @_;
   $self->{$name} = $value;
}

sub get {
   my ($self, $name) = @_;
   return $self->{$name};
}

Теперь вы можете использовать класс в своем коде:

import MyClass;

my $instance = MyClass->new; # Same as MyClass::new("MyClass")
$instance->set('age', 30);   # Same as MyClass::set($instance, 'age', 30)
print $instance->get('age'); # Same as MyClass::get($instance, 'age')

Оператор со стрелкой в ​​сочетании с тем, как bless связывает ссылку на имя пакета, дает хороший объектно-ориентированный синтаксис.

Самая верхняя часть документации по perlobj дает полезное объяснение с примерами.

Объект - это просто структура данных

В отличие от многих других языков, которые поддерживают объектную ориентацию, Perl не предоставляет никакого специального синтаксиса для создания объекта. Объекты - это просто структуры данных Perl (хэши, массивы, скаляры, файловые дескрипторы и т. Д.), Которые были явно связаны с определенным классом.

Эта явная ассоциация создается встроеннымbless функция, которая обычно используется в подпрограмме конструктора класса.

Вот простой конструктор:

package File;

sub new {
    my $class = shift;

    return bless {}, $class;
}

Имя new не особенный Мы могли бы назвать наш конструктор как-нибудь еще:

package File;

sub load {
    my $class = shift;
    return bless {}, $class;
}

Современное соглашение для модулей OO состоит в том, чтобы всегда использовать new в качестве имени для конструктора, но это не требуется. Любая подпрограмма, которая объединяет структуру данных в класс, является допустимым конструктором в Perl.

В предыдущих примерах {} Код создает ссылку на пустой анонимный хеш. Затем функция благословения берет эту ссылку и связывает хеш с классом в $class, В простейшем случае $class переменная будет содержать строку "File",

Мы также можем использовать переменную для хранения ссылки на структуру данных, которая благословляется как наш объект:

sub new {
    my $class = shift;

    my $self = {};
    bless $self, $class;

    return $self;
}

Как только мы благословили хэш, на который ссылается $self мы можем начать вызывать методы для этого.

bless это более старый способ конструирования объектов в Perl. Для нового кода я бы рекомендовал использовать Moose, Moo или Object::Tiny.

Эти варианты упорядочены от самых больших по размеру и сложности (Moose) до самых простых с наименьшим количеством функций (Object::Tiny).

Если ты видишь bless в другом Perl-коде это работает так, как описывают другие ответы.

Другие вопросы по тегам