如何在OOP perl中使用传递的参数?

时间:2013-06-19 03:31:30

标签: perl oop construct

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

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

bless $point,$class;
}

所以,如果我实例化:

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

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

如何访问构造函数中的哈希?

我尝试过这样的事情:

print $object -> %$point;

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

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

1 个答案:

答案 0 :(得分:2)

  

如何访问构造函数中的哈希?

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

所以你现在可以这样做:

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

但访问对象的私有部分并不安全。我建议你为它创建访问器而不是直接操作哈希。 E.g。

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

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

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

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

my $object = Exercises->new;

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

  

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

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

传入的变量位于子例程的@_中。通常情况下,为了便于阅读,他们会分配给其他东西。 E.g。

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

一些额外提示

您可以使用以下方法查看整个数据结构:

use Data::Dumper;
print Dumper $object;

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