当我声明一个变量,其值属于内置类时,我只需编写
my Int $a;
但是当我想使用用户定义的类时,我have to use Classname.new
。
my class House {
has $.area is rw;
}
my $house1 = House.new;
$house1.area = 200;
say $house1.area;
所以,我天真的问题是,这种差异的原因是什么?为什么我们不能简单地写my House $house1
?
我的最终目标是使用一个数组,其值是用户定义类的实例。如何正确执行以下操作?
my @houses ...;
@houses[10].area = 222;
答案 0 :(得分:13)
my House $a
与my Int $a
的作用相同。它对您可以放入的值施加限制。如果查看变量的内容,您将获得该限制的类型对象。
是你可以使用的技巧,所以你不必重复House
位:my House $a .= new
,相当于{{1} }}
回到你的问题:是的,你可以做一些麻烦:
my House $a = House.new
我们为访问器方法创建了两个候选者:一个采用未定义的类型对象,另一个采用实例化对象。第一个修改其调用者(假设它是一个可以设置的容器),然后调用该方法的实例化版本。我将此作为练习留给读者将其转换为class House {
has $.area;
multi method area(House:U \SELF:) is raw {
(SELF = House.new).area
}
multi method area(House:D:) is raw {
$!area
}
}
my House @houses;
@houses[2].area = 42;
say @houses # [(House) (House) House.new(area => 42)]
特征。
答案 1 :(得分:3)
当您编写my Int $a;
时,您将拥有Int
类型的变量,但没有值,甚至是容器。 $a
的具体值为(Int)
。
与my House $house;
相同 - 您将获得(House)
值。
在你的情况下,你必须通过一些House值初始化数组的元素。例如:
my @houses = House.new() xx 11;
@houses[10].area = 222;
答案 2 :(得分:3)
我认为你错过了编译器正在为你做一些工作的部分。当您有一个文字编号时,解析器会识别它并为其构造正确的数字对象。在rakudo/src/Perl6/Actions.nqp中已经发现了一个虚拟且看不见的Int.new()
。这是在NQP级别,但它是相同的想法。