我在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
?
答案 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
时实际检索创建的对象!