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

Eug*_*sky 9 perl6

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

my Int $a;
Run Code Online (Sandbox Code Playgroud)

但是当我想使用用户定义的类时,我必须使用 Classname.new.

my class House {
    has $.area is rw;
}

my $house1 = House.new;
$house1.area = 200;
say $house1.area;
Run Code Online (Sandbox Code Playgroud)

所以,我天真的问题是,这种差异的原因是什么?为什么我们不能简单地写my House $house1

我的最终目标是使用一个数组,其值是用户定义的类的实例.如何正确执行以下操作?

my @houses ...;
@houses[10].area = 222;
Run Code Online (Sandbox Code Playgroud)

Eli*_*sen 13

my House $a做同样的事my Int $a.它对您可以放入的值施加限制.如果查看变量的内容,您将获得该限制的类型对象.

还有就是,你可以使用,虽然,这样你就不必再重复了一招House位:my House $a .= new,这是相当于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)]
Run Code Online (Sandbox Code Playgroud)

我们为访问器方法创建了两个候选者:一个采用未定义的类型对象,另一个采用实例化对象.第一个修改其调用者(假设它是一个可以设置的容器),然后调用该方法的实例化版本.我将这作为练习留给读者将其变成一种Attribute特质.