另一个问题。我有这个构造函数:
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)
。所以我认为这是一个哈希。
我的理解是我不能在里面使用变量,因为它们是词汇。我是对的吗?
答案 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;
您可能不知道您也可以使用可以帮助您更快地创建类的模块。看看这些: