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
相关产品推荐
相关产品推荐

