Как использовать 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-коде это работает так, как описывают другие ответы.