类型<class>的调用者没有这样的方法<name>

时间:2018-07-12 02:45:07

标签: perl6

我创建了一个包含用于函数重载的multi定义的类,但是当我尝试调用该类和重载的方法时,它会引发错误。可以运行以产生此错误的工作示例如下所示:

class Test
{
    multi test(@data) {
        return test(@data, @data.elems);
    }

    multi test(@data, $length) {
        return 0;
    }
}

my @t = 't1', 't2', 't3';
say Test.test(@t);

错误:

No such method 'test' for invocant of type 'Test'. Did you mean any of these?
    List
    Set
    gist
    list

  in block <unit> at test.p6 line 13

我可能做错了,有人可以指出我正确的方法吗?

编辑:我正在有效地尝试将其作为一个模块,可以用于其他用途。

3 个答案:

答案 0 :(得分:8)

您需要在self 方法之前添加test关键字:

class Test
{

    multi method test(@data) {
        return self.test(@data, @data.elems);
    }

    multi method test(@data, $length) {
        return 0;
    }

}

my @t = 't1', 't2', 't3';
say Test.test(@t);

注释:在Perl 6类中,使用method关键字声明一个方法。

答案 1 :(得分:6)

出现no such method错误的原因是,除非另有说明,否则multi的默认值为sub。您需要multi method test

答案 2 :(得分:2)

其他答案必须有助于解释.relim()的用法,但是可选参数可能是获得相同结果的更简单方法:

ax.ignore_existing_data_limits = True
ax.update_datalim(scatter.get_datalim(ax.transData))
ax.autoscale_view()