gpt4 book ai didi

raku - Perl6 : . sort() 不使用覆盖的 cmp

转载 作者:行者123 更新时间:2023-12-04 14:22:30 25 4
gpt4 key购买 nike

根据 the documentation , 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;

给出输出:
((1,1) (2,4) (3,2))

当我使用:
say @p.sort(&infix:<cmp>);

它确实提供了正确的输出:
((1,1) (3,2) (2,4))

这是文档中的错误、功能还是缺陷?
有没有办法让 .sort()在一个 Point 的列表中■ 使用自定义排序顺序而不指定例程?

最佳答案

我认为这是一个由设计破坏的案例。考虑以下片段:

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;

新的 multi 候选的定义将生成一个新的 proto sub,它只在词法上可见。如 sort方法在设置中定义(概念上,一个封闭的范围),它不会看到你的新多候选。

或许可以制作 sort查找 &infix:<cmp>动态而不是词法,尽管我怀疑这样的更改必须等待 6.e,即使我们决定这是我们想要做的事情,这不是给定的。

作为一种解决方法,您可以执行以下操作
constant CMP = &infix:<cmp>;
multi sub infix:<cmp>(Point $a, Point $b) { ... }
BEGIN CMP.wrap(&infix:<cmp>);

现在,虽然我不一定推荐它(与被认为有害的全局状态以及所有爵士乐混为一谈)......

关于raku - Perl6 : . sort() 不使用覆盖的 cmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53760999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com