Perl 6中只有一个参数的构造函数

时间:2015-10-12 04:52:12

标签: perl6

我想覆盖new,这样只能通过将一个参数传递给构造函数来创建我的类,不多也不少。

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

它有什么用?

1 个答案:

答案 0 :(得分:9)

自定义构造函数需要调用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)仅传递了一个命名参数。请注意,所述方法是您班级中唯一存在的.new(),因此如果调用确实有效,那么您最终会得到无限递归!