Perl中的对象是否只能在包内声明?

时间:2013-06-18 08:36:31

标签: perl oop

我不能做像

这样的事情
#! usr/bin/perl
use strict;
use warnings;
use Horse; #this is the package

my $test;

bless $test,Horse;

上面的代码是否将$test实例化为对Horse包的对象引用?或者Perl中的对象只是“已经有bless语句”等待实例化的包?

另外,您是否可以提供对象变量或方法或函数的样本访问?无论它在Perl中被称为什么?

1 个答案:

答案 0 :(得分:4)

bless builtin使用包名称标记引用。然后,该包用于解析在对象上调用的方法。所以,即使没有明确的包,也可以做

my $obj = bless { x => 1}, 'Foo';

sub Foo::x {
  my $self = shift;
  return $self->{x};
}

print "1 == ", $obj->x, "\n";

请注意,您应引用提供给bless的包名称。

所以是的,你可以祝福任何类的引用,包括导入的类。但请注意,这不会运行构造函数,并打破“封装”,这是一种面向对象的原则,您应该只使用方法与类/与对象进行交互(例如new类方法)。


编辑:完全限定名称

每个全局变量都有一个完全限定的名称,该名称由包名称和变量名称组成。子程序只是一种特殊的变量。例如,这个:

$Some::Package::var = 5;
sub Some::Package::give_var { return $Some::Package::var }

大致相同
{
  package Some::Package; # package declaration opens a new namespace
  our $var = 5;
  sub give_var { return $var }
}

因此,sub Foo::x {...}在包x中声明了一个名为Foo的子。