在Perl 6中声明属于用户定义类的变量

时间:2017-11-28 09:54:32

标签: perl6

当我声明一个变量,其值属于内置类时,我只需编写

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;

3 个答案:

答案 0 :(得分:13)

my House $amy 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级别,但它是相同的想法。