-1

我不能做类似的事情

#! usr/bin/perl
use strict;
use warnings;
use Horse; #this is the package

my $test;

bless $test,Horse;

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

另外,您能否提供对对象变量或方法或函数的示例访问?在 Perl 中叫什么?

4

1 回答 1

4

bless内置标记带有包名称的引用。然后使用该包来解析在对象上调用的方法。因此,即使没有明确的包,也可以这样做

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

于 2013-06-18T08:40:03.500 回答