根据文档,sort比较使用infix:<cmp>.
但:
class Point
{
has Int $.x;
has Int $.y;
method Str { "($!x,$!y)" }
method gist { self.Str }
}
multi sub infix:<cmp>(Point $a, Point $b) { $a.y cmp $b.y || $a.x cmp $b.x }
my @p = Point.new(:3x, :2y), Point.new(:2x, :4y), Point.new(:1x, :1y);
say @p.sort;
Run Code Online (Sandbox Code Playgroud)
给出输出:
((1,1) (2,4) (3,2))
Run Code Online (Sandbox Code Playgroud)
我用的时候:
say @p.sort(&infix:<cmp>);
Run Code Online (Sandbox Code Playgroud)
它确实提供了正确的输出:
((1,1) (3,2) (2,4))
Run Code Online (Sandbox Code Playgroud)
这是文档中的错误,功能还是缺陷?有没有一种方法可以.sort()在一个Points 的列表上使用自定义排序顺序而不指定例程?
我认为这是一个破碎的设计案例.请考虑以下代码段:
my $a = Point.new(:3x, :2y);
my $b = Point.new(:2x, :4y);
say &infix:<cmp>.WHICH;
say $a cmp $b;
{
multi sub infix:<cmp>(Point $a, Point $b) { $a.y cmp $b.y || $a.x cmp $b.x }
say &infix:<cmp>.WHICH;
say $a cmp $b;
}
say &infix:<cmp>.WHICH;
say $a cmp $b;
Run Code Online (Sandbox Code Playgroud)
新多候选者的定义将生成一个仅在词汇上可见的新原型子.由于该sort方法是在设置中定义的(在概念上是一个封闭范围),因此它不会看到您的新多候选者.
有可能动态地sort查找&infix:<cmp>而不是词法,但我怀疑这样的改变将不得不等待6.e即使我们决定这是我们想要做的事情,这不是给定的.
作为一种解决方法,你可以做类似的事情
constant CMP = &infix:<cmp>;
multi sub infix:<cmp>(Point $a, Point $b) { ... }
BEGIN CMP.wrap(&infix:<cmp>);
Run Code Online (Sandbox Code Playgroud)
就目前而言,虽然我不一定会推荐它(搞乱全球状态被认为是有害的,所有那些爵士乐)......
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |