当我声明一个变量,其值属于内置类时,我只是写
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特质.