当参数包含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个匹配项。
必须仔细研究所有这些内容,以确认源代码显示的用于比较这些各种类型的值的内容。还要注意,每对逻辑都是成对的,这有点奇怪。因此,如果存在三个值a
,b
和和c
,每个值的类型a
都不相同,则逻辑将是初始最小值,然后将存在,b cmp a
这将是cmp
该顺序按类型组合的逻辑取胜的逻辑,然后c cmp d
在哪里d
是赢得b cmp a
比较的那个,cmp
逻辑将按照该顺序适合该对类型。
让我们从第一个开始-进行中的比赛core/Order.pm6
-如果没有其他更具体的比赛,则大概是万能的:
如果两个参数cmp
均为数字,则比较是合适的数字比较(例如,如果它们均为Int
s,则比较是两个任意精度整数)。
如果一个参数是数字而不是其他参数,则将-Inf
和Inf
排序到开始和结束,但是在两个参数都被强制转换之后进行比较.Stringy
。
否则,两个论点都被.Stringy
定理所强制。
因此,这是默认设置。
下一个将不得不通过各个过载。例如,下一个就是对cmp
在OPScore/allomorphs.pm6
和我们看到的同质异晶型(IntStr
等)比较数值,然后再字符串,如果不解决。注意注释:
我们首先将这些同种类型的cmp ops定义为数字,然后定义Str。如果只需要cmp的一半,则需要强制args
顺便说一句,我看到jnthn发布了又一个好答案,所以是时候包装这个了。:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句