Perl 6 中只有 1 个参数的构造函数
A constructor with only 1 argument in Perl 6
我想覆盖 new
,这样我的 class 只能通过将 一个 参数传递给构造函数来创建,不多也不少。
class MyClass {
has $.var1;
method new($var1) {
return MyClass.new(var1 => $var1);
}
}
my $my_class1 = MyClass.new(33);
say $my_class1.var1;
错误是:
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
怎么回事?
自定义构造函数需要调用bless
,即
class MyClass {
has $.var1;
method new($var1) {
return self.bless(var1 => $var1);
}
}
有些地方可以改进,例如
- 可以添加显式调用参数并使用
:U
使 .new()
在调用实例对象时失败
- 显式
return
是多余的 - 无论如何都会返回方法中的最后一个表达式,目前,它实际上会损害性能
- 传递保存在同名变量中的命名参数有语法糖
把它们放在一起,我们最终得到
class MyClass {
has $.var1;
method new(MyClass:U: $var1) {
self.bless(:$var1);
}
}
关于你的错误来自哪里:
您的方法 new
被声明为采用位置参数(由于隐式调用,给出了 2 个预期参数的总数),但调用 MyClass.new(var1 => $var1)
仅传递了一个命名参数。请注意,所述方法是您 class 中唯一存在的 .new()
,因此如果调用确实有效,您将以无限递归结束!
我想覆盖 new
,这样我的 class 只能通过将 一个 参数传递给构造函数来创建,不多也不少。
class MyClass {
has $.var1;
method new($var1) {
return MyClass.new(var1 => $var1);
}
}
my $my_class1 = MyClass.new(33);
say $my_class1.var1;
错误是:
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
怎么回事?
自定义构造函数需要调用bless
,即
class MyClass {
has $.var1;
method new($var1) {
return self.bless(var1 => $var1);
}
}
有些地方可以改进,例如
- 可以添加显式调用参数并使用
:U
使.new()
在调用实例对象时失败 - 显式
return
是多余的 - 无论如何都会返回方法中的最后一个表达式,目前,它实际上会损害性能 - 传递保存在同名变量中的命名参数有语法糖
把它们放在一起,我们最终得到
class MyClass {
has $.var1;
method new(MyClass:U: $var1) {
self.bless(:$var1);
}
}
关于你的错误来自哪里:
您的方法 new
被声明为采用位置参数(由于隐式调用,给出了 2 个预期参数的总数),但调用 MyClass.new(var1 => $var1)
仅传递了一个命名参数。请注意,所述方法是您 class 中唯一存在的 .new()
,因此如果调用确实有效,您将以无限递归结束!