我实现了一个称为cell的类,并尝试将char存储到其中。 我发现用我的setter和getter来检索char是一个问题。
#This is the detail of the class:
package Cell;
sub new{
my $class = shift;
my $self = {
content => -1,
};
return bless $self, $class;
}
#This is my setter and getter
sub setContent{
my ($self,$ch) = @_;
$self->{content} = $ch;
print("stored char".$self->{content}."\n");
}
sub getContent{
my $self = @_;
print("passing back char".$self->{content}."\n");
return $self->{content};
}
# this is the way i used the class
my $ch = "a";
my $cell = Cell->new();
$cell->setContent($ch);
my $testvar = $cell->getContent();
print("test start\n".$testvar);
print("test end\n");
#
我发现我可以将char传递给setter,并且应该将其存储在$ self-> {content}中,但是当尝试使用getter检索char时,$ self-> {content}变为空
答案 0 :(得分:3)
一个直接错误是您的“ getter” getContent
方法中的行:
my $self = @_; # assigns number of elements in the array to $self!
这试图将一个数组分配给一个标量,这是没有意义的。相反,要做的是对数组求值到其元素数,并将那个分配给$self
。因此,在该方法的其余部分中,$self
中没有对象,只有一个数字,这里是1
。
如果您通过程序顶部的use warnings;
启用了warnings,则会收到
在...处使用“严格引用”时,不能将字符串(“ 1”)用作HASH引用。
尝试在$self
上调用方法的行,告诉您期望的对象(hashref)实际上是一个字符串。这样可以为您提供准确的行号和内容丰富的diagnostic message。如果未启用警告,则代码会悄悄进行,但无法按预期进行。
道德:请始终以use warnings
(和use strict
)开头
解决方法是使其成为“列表分配”-在列表“ context”中分配
my ($self) = @_;
其中,列表上下文由左侧的=
施加在赋值运算符(...)
上。现在,将数组@_
中的元素一对一地分配给()
中列出的变量。 LHS上只有一个变量($self
),因此@_
的第一个元素被分配给它,其余的(如果有的话)被丢弃。
或者,在标量分配中将@_
的单个元素分配给$self
。
在面向对象的代码中,通常使用shift完成此操作,因此也可以从参数列表中删除该对象,以方便以后使用
my $self = shift;
默认情况下,子例程中的shift
适用于@_
。