1

另一个问题。我有这个构造函数:

sub constructor {
 my $class = shift;
 my $point = {
  year => 2013,
  month = 'june',
  @_,
 };

bless $point,$class;
}

所以如果我实例化:

my $object = Exercises -> constructor (year => 2012,day => 'Monday');

构造函数中覆盖的值有什么用?任何人都可以找到一个很好的例子,其中使用了构造函数中的默认值吗?

以及如何访问构造函数内的哈希?

我试过这个:

print $object -> %$point;

这是错误的,但我在上面做了那个代码,因为print $object只有当我。它说 Classname=HASH(0x152d998)。所以我认为这是一个哈希。

我的理解是我不能在里面使用变量,因为它们是词法的。我对吗?

4

1 回答 1

2

以及如何访问构造函数内的哈希?

$point您在构造函数 ( )中的hashref对象。当你bless引用时,你把它变成一个对象。

所以你现在可以这样做:

print $point->{year};  # from inside constructor
...
print $object->{year}; # after construction

但是访问对象的私有部分并不安全。我建议您为其创建访问器,而不是直接操作散列。例如

sub year {
    my $self = shift; # this is now the object
    if (@_) {
        $self->{year} = $_[0];
    }
    return $self->{year};
}

...
print $object->year(1984);
print $object->year;

构造函数中覆盖的值有什么用?任何人都可以找到一个很好的例子,其中使用了构造函数中的默认值吗?

由于您在构造函数中提供了默认值,因此如果您在没有任何参数的情况下调用构造函数,则将使用这些默认值。

my $object = Exercises->new;

但是由于您@_在最后添加到 hashref,如果您向构造函数提供参数(并且哈希键对应于默认值),它们将覆盖默认值。

我的理解是我不能在里面使用变量,因为它们是词法的。我对吗?

我不确定我是否真的理解你的问题。您可以在任何地方使用变量。只要它们在范围内,您就可以引用它们,或者如果需要,您可以将变量传递给构造函数或其他方法。

传入的变量@_在您的子例程中。通常他们被分配给其他东西以提高可读性。例如

my $self = shift; # this shifts from @_ implicitly
my %args = @_; # for hash args
my ($year, $month, $day) = @_;

一些额外的提示

您可以通过以下方式查看整个数据结构:

use Data::Dumper;
print Dumper $object;

您可能不知道您还可以使用可以帮助您更快地创建类的模块。看看这些:

于 2013-06-19T06:16:48.260 回答