perl6混合的Str和Int参数的最小值和最大值

赖脯

当参数包含Str和Int的混合时,哪种类型首先针对min和max例程进行转换?

To exit type 'exit' or '^D'
> say ("9", "10").max
9
> say ("9", "10").max.WHAT
(Str)
> say (9, "10").max
9
> say (9, "10").max.WHAT
(Int)                     # if convert to Int first, result should be 10
> say ("9", 10).max
9
> say ("9", 10).max.WHAT
(Str)                     # if convert to Str first, result should be 9
> say (9, "10").min
10
> say (9, "10").min.WHAT
(Str)                     # does min and max convert Str or Int differently?

如果min或max将参数转换为第一个参数的类型,则此处的结果仍然不一致。

谢谢您的启发!

雷夫

好吧,jnthn回答了。他的回答总是权威性的,而且通常也非常清晰明了。这也不例外。:)但是我已经开始,所以我将完成并发布...

在Rakudo源“方法分钟”的搜索产生4个匹配其中最通用的是在比赛core/Any-iterable-methods.pm6

看起来很难理解,但nqp实际上实际上是P6的简单子集。关键是它用于cmp比较从要比较的值序列中拉出的每个值与最新的最小值($pulled cmp $min位)。

接下来是在Rakudo源中搜索“ sub infix:<cmp>”这产生14个匹配项。

必须仔细研究所有这些内容,以确认源代码显示的用于比较这些各种类型的值的内容。还要注意,每对逻辑都是成对的,这有点奇怪。因此,如果存在三个值ab和和c,每个值的类型a都不相同,则逻辑将是初始最小值,然后将存在,b cmp a这将是cmp该顺序按类型组合的逻辑取胜的逻辑,然后c cmp d在哪里d是赢得b cmp a比较的那个,cmp逻辑将按照该顺序适合对类型。

让我们从第一个开始-进行中的比赛core/Order.pm6-如果没有其他更具体的比赛,则大概是万能的:

  • 如果两个参数cmp均为数字,则比较是合适的数字比较(例如,如果它们均为Ints,则比较是两个任意精度整数)。

  • 如果一个参数是数字而不是其他参数,则将-InfInf排序到开始和结束,但是在两个参数都被强制转换之后进行比较.Stringy

  • 否则,两个论点都被.Stringy定理所强制

因此,这是默认设置。

下一个将不得不通过各个过载。例如,下一个就是cmp在OPScore/allomorphs.pm6和我们看到的同质异晶型(IntStr等)比较数值,然后再字符串,如果不解决。注意注释:

我们首先将这些同种类型的cmp ops定义为数字,然后定义Str。如果只需要cmp的一半,则需要强制args

顺便说一句,我看到jnthn发布了又一个好答案,所以是时候包装这个了。:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章