有没有人能解释一下在perl中使用bless的重要性和方法。我读过很多关于bless上的堆栈溢出的线程,但他们不清楚。
发布于 2013-06-20 19:46:17
这是一种让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-20 21:07:21
perlobj documentation的顶部通过示例给出了有用的解释。
一个对象仅仅是一个数据结构
与许多其他支持面向对象的语言不同,Perl不提供任何用于构造对象的特殊语法。对象仅仅是Perl数据结构(散列、数组、标量、文件句柄等)显式地与特定类相关联。
这种显式关联是由内置的bless函数创建的,该函数通常在类的构造器子例程中使用。
下面是一个简单的构造函数:
包文件;子新{ my $class = shift;return $class {},$class;}
new这个名字并不特别。我们可以将构造函数命名为其他名称:
包文件;子加载{ my $class = shift;return $class {},$class;}
OO模块的现代约定是始终使用new作为构造函数的名称,但并不要求这样做。在Perl中,任何将数据结构放入类中的子例程都是有效的构造函数。
在前面的示例中,{}代码创建了一个对空匿名哈希的引用。然后bless函数获取该引用,并将散列与$class中的类关联起来。在最简单的情况下,$class变量最终将包含字符串"File"。
我们还可以使用一个变量来存储对作为我们的对象的数据结构的引用:
子新{ my $class = shift;my $self = {};保佑$self,$class;return $self;}
一旦我们完成了$self引用的散列,我们就可以开始调用它的方法了。
发布于 2013-06-20 22:29:29
bless是在Perl中构造对象的一种较旧的方法。对于新代码,我建议使用Moose、Moo或Object::Tiny。
这些选项从大小和复杂性最大的(Moose)到功能最少的最简单的(Object::Tiny)排序。
如果您在其他perl代码中看到bless,那么它的工作方式与其他答案所描述的一样。
https://stackoverflow.com/questions/17212597
复制相似问题