首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Perl中使用Bless运算符?

如何在Perl中使用Bless运算符?
EN

Stack Overflow用户
提问于 2013-06-20 19:36:00
回答 3查看 3.6K关注 0票数 2

有没有人能解释一下在perl中使用bless的重要性和方法。我读过很多关于bless上的堆栈溢出的线程,但他们不清楚。

EN

回答 3

Stack Overflow用户

发布于 2013-06-20 19:46:17

这是一种让Perl将包视为面向对象的类,并将受祝福的对象视为这些类的实例的方法。

对引用进行标记,以便解释器知道它与哪个包相关联。例如,如果您编写:

代码语言:javascript
运行
复制
$x = {}; bless $x, "somepackage";

然后,您可以稍后编写:

代码语言:javascript
运行
复制
$x->method(1, 2, 3);

解释器会将其处理为:

代码语言:javascript
运行
复制
somepackage::method($x, 1, 2, 3);

这里有一个非常简单的例子。在名为MyClass.pm的文件中创建一个类:

代码语言:javascript
运行
复制
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};
}

现在,您可以在代码中使用该类:

代码语言:javascript
运行
复制
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如何绑定对包名的引用,为您提供了很好的面向对象语法。

票数 7
EN

Stack Overflow用户

发布于 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引用的散列,我们就可以开始调用它的方法了。

票数 2
EN

Stack Overflow用户

发布于 2013-06-20 22:29:29

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

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

如果您在其他perl代码中看到bless,那么它的工作方式与其他答案所描述的一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17212597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档