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

我想覆盖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

怎么了?

解决方法

自定义构造函数需要调用 bless,即
class MyClass {
    has $.var1;

    method new($var1) {
        return self.bless(var1 => $var1);
    }
}

有一些事情可以改进,例如

> one可以添加一个显式的invocant参数并使用:U在实例对象上调用时使.new()失败
>显式返回是多余的 – 无论如何都会返回方法中的最后一个表达式,而且目前它实际上会损害性能
>用于传递保存在同名变量中的命名参数的语法糖

把它们放在一起,我们最终得到了

class MyClass {
    has $.var1;

    method new(MyClass:U: $var1) {
        self.bless(:$var1);
    }
}

至于你的错误来自哪里:

您的方法new被声明为采用位置参数(由于隐式调用,总计数为2个预期参数),但调用MyClass.new(var1 => $var1)仅传递了一个命名参数.请注意,所述方法是您的类中唯一存在的.new(),因此如果调用实际上有效,那么您最终会得到无限递归!

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...