Perl中的基本OOP概念

时间:2017-06-17 08:40:47

标签: perl oop

我在Perl中学习OOP概念,其语法与Java不同,后者我用它来学习OOP概念。

我有一个例子来宣布一个班级Person,但我有点困惑。

代码如下

package Person;

sub new {

    my $class = shift;

    my $self  = {
        _firstName => shift,
        _lastName  => shift,
        _ssn       => shift,
    };

    # Print all the values just for clarification.

    print "First Name is $self->{_firstName}\n";
    print "Last Name is $self->{_lastName}\n";
    print "SSN is $self->{_ssn}\n";

    bless $self, $class;

    return $self;
}

从上面的例子中,my $self是标量变量还是哈希变量?

据我所知,Perl中的哈希变量用%声明,而$用于标量变量。

bless函数有什么用?为什么返回$self

2 个答案:

答案 0 :(得分:1)

  

从上面的例子中,my $self是标量变量还是哈希变量?

$self是标量变量。您可以告诉它,因为它以$开头。

括号内更新:在评论中,brian指出这条规则有缺陷。他当然是正确的 - 正如他通常那样。$在{{{}开头1}}表示它是标量,而不是标量变量。但是如果你在开始时使用$self并且缺少查找括号 - 如$[...] - 在变量名后面,您可以确定这是一个标量变量。)

但你的完整代码是:

{...}

这里,my $self = { _firstName => shift, _lastName => shift, _ssn => shift, }; 是“匿名哈希构造函数”。它创建一个哈希并返回对它的引用。引用总是标量值,因此它们可以存储在标量变量中(这是它们存在的主要原因之一)。

所以{ ... }仍然是标量变量,但它包含对散列的引用。

  

祝福功能的用途是什么?

$self的调用有效地为bless()变量指定了一个类型。 Perl需要知道对象的类型,以便知道要搜索对象方法的符号表。当我在这里运行课程时,我喜欢说$self就像在便利贴上写下对象的类型并将它拍在对象的额头上 - 所以,以后,人们可以知道什么类型是。

  

为什么它会返回$ self?

您将此方法称为:

bless()

my $person = Person->new(...); # passing various parameters 方法需要返回新创建的对象,以便您可以将其存储在变量中并稍后以某种方式对其进行操作。

但Perl子例程返回子例程中最后一个表达式的值,new()返回“祝福”对象,所以用上一行结束子例程就可以了:

bless()

但传统的做法是更明确地返回值,因此大多数人都会添加bless $self, $class; 行。它可以提供更好的文档代码。

答案 1 :(得分:0)

mysqldbcopy --source=root:root@localhost \ --destination=root:root@localhost world:world_clone 是哈希引用,因此在大多数操作中它被视为标量。

$self用于表示此哈希引用是给定类的对象(除非您有子句classe,否则此处为bless),以便您可以使用此类的函数调用Person符号。

$object->function是必要的,这样您就可以在致电return $self时实际检索创建的对象!