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

Declaring a variable belonging to a user-defined class in Perl 6

当我声明一个变量时,它的值属于一个内置的class,我只是写

my Int $a;

但是当我想使用用户定义的 class 时,我 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?

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

my @houses ...;
@houses[10].area = 222;

当您编写 my Int $a; 时,您将拥有一个 Int 类型的变量,但没有值,甚至没有容器。 $a的具体值为(Int).

my House $house; 相同 - 您将获得 (House) 值。

在您的情况下,您必须通过某个 House 值来初始化数组的元素。例如:

my @houses = House.new() xx 11;
@houses[10].area = 222;

my House $amy 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)]

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

我认为您错过了编译器为您完成一些工作的部分。当你有一个文字数字时,解析器会识别它并为它构造正确的数字对象。在 rakudo/src/Perl6/Actions.nqp 中已经发生了一个虚拟的和看不见的 Int.new()。虽然是NQP级别,但是思路是一样的