You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Raku中是否存在语法简写,匹配多签名中含自定义Measure类型的参数

简化Raku中Measure类型的+运算符重载

当然有更简洁的写法!你现在写的三个multi sub其实可以合并成一个,利用Raku的where从句来捕获所有至少包含一个Measure:D类型参数的组合,完美覆盖你原来的三种情况:

multi sub infix:<+> ( $left, $right where $left ~~ Measure:D or $right ~~ Measure:D ) 
    is equiv(&infix:<+>) 
    is export 
{
    my ( $result, $argument ) = inf-prep( $left, $right );
    return $result.add( $argument );
}

为什么这个写法能覆盖所有场景?

这个multi签名会匹配任意两个参数,只要其中至少一个是Measure:D类型,刚好对应你原来的三个场景:

  • 左、右参数都是Measure:D
  • 左参数是Measure:D,右参数为任意类型
  • 左参数为任意类型,右参数是Measure:D

由于你已经有inf-prep函数处理参数的预处理逻辑(比如将非Measure类型转换为兼容格式),这个单一的multi子句和你之前三个声明的行为完全一致。

可选优化:更简洁的约束写法

如果你追求更紧凑的语法,还可以用占位符和列表检查来简化where从句的逻辑:

multi sub infix:<+> ( $left, $right where ( $left, $right ).grep(Measure:D) ) 
    is equiv(&infix:<+>) 
    is export 
{
    my ( $result, $argument ) = inf-prep( $left, $right );
    return $result.add( $argument );
}

这里( $left, $right ).grep(Measure:D)会检查两个参数中是否存在Measure:D类型的实例,效果和之前的约束完全一样,可读性也不错。

这样一来,你就不用重复编写几乎完全相同的multi声明了,代码更简洁、易读也更易维护!

内容的提问来源于stack exchange,提问作者librasteve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:21:56