2

谁能解释一下重要性以及如何在 perl 中使用 bless。我已经阅读了许多关于 bless 堆栈溢出的线程,但它们并不清楚。

4

3 回答 3

7

这是一种使 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 如何将引用绑定到包名称,为您提供了很好的面向对象语法。

于 2013-06-20T11:46:17.133 回答
2

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 中的有效构造函数。

在前面的示例中,{}代码创建了对空匿名哈希的引用。然后 bless 函数获取该引用并将哈希与$class. 在最简单的情况下,$class变量最终会包含字符串"File"

我们还可以使用变量来存储对作为我们的对象的数据结构的引用:

sub new {
    my $class = shift;

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

    return $self;
}

一旦我们祝福了 引用的哈希,$self我们就可以开始调用它的方法。

于 2013-06-20T13:07:20.997 回答
1

bless是一种在 Perl 中构造对象的旧方法。对于新代码,我建议改用MooseMooObject::Tiny

这些选项的大小和复杂性从最大(Moose)到特征最少的最简单(Object::Tiny)排序。

如果您bless在其他 perl 代码中看到,它就像其他答案所描述的那样工作。

于 2013-06-20T14:29:29.057 回答