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(),因此如果调用确实有效,您将以无限递归结束!