6 perl6
我想覆盖,new
以便只能通过将一个参数传递给构造函数来创建我的类,不多也不少.
class MyClass {
has $.var1;
method new($var1) {
return MyClass.new(var1 => $var1);
}
}
my $my_class1 = MyClass.new(33);
say $my_class1.var1;
Run Code Online (Sandbox Code Playgroud)
错误是:
Too few positionals passed; expected 2 arguments but got 1
in method new at test1.pl6:28
in method new at test1.pl6:28
in block <unit> at test1.pl6:33
Run Code Online (Sandbox Code Playgroud)
怎么了?
自定义构造函数需要调用bless
,即
class MyClass {
has $.var1;
method new($var1) {
return self.bless(var1 => $var1);
}
}
Run Code Online (Sandbox Code Playgroud)
有一些事情可以改进,例如
:U
使.new()
失败的实例对象调用时return
是多余的 - 无论如何都会返回方法中的最后一个表达式,而且目前它实际上会损害性能把它们放在一起,我们最终得到了
class MyClass {
has $.var1;
method new(MyClass:U: $var1) {
self.bless(:$var1);
}
}
Run Code Online (Sandbox Code Playgroud)
至于你的错误来自哪里:
new
声明您的方法采用位置参数(由于隐式调用,总计数为2个预期参数),但调用MyClass.new(var1 => $var1)
只传递了一个命名参数.请注意,所述方法是.new()
您班级中唯一存在的方法,因此如果调用确实有效,那么您最终会得到无限递归!