在 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 $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)]
我们为访问器方法创建了两个候选者:一个接受未定义类型的对象,另一个接受实例化对象。第一个修改它的调用者(假设它是一个可以设置的容器),然后调用该方法的实例化版本。我将此作为 reader 的练习,将其变成 Attribute
特征。
我认为您错过了编译器为您完成一些工作的部分。当你有一个文字数字时,解析器会识别它并为它构造正确的数字对象。在 rakudo/src/Perl6/Actions.nqp 中已经发生了一个虚拟的和看不见的 Int.new()
。虽然是NQP级别,但是思路是一样的
当我声明一个变量时,它的值属于一个内置的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 $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)]
我们为访问器方法创建了两个候选者:一个接受未定义类型的对象,另一个接受实例化对象。第一个修改它的调用者(假设它是一个可以设置的容器),然后调用该方法的实例化版本。我将此作为 reader 的练习,将其变成 Attribute
特征。
我认为您错过了编译器为您完成一些工作的部分。当你有一个文字数字时,解析器会识别它并为它构造正确的数字对象。在 rakudo/src/Perl6/Actions.nqp 中已经发生了一个虚拟的和看不见的 Int.new()
。虽然是NQP级别,但是思路是一样的