raku - Perl6 中多种可能的输出类型
问题描述
我想做一个返回 aRange
或a 组成的函数any Junction
multiple Ranges
。
例如:
sub foo (Range $a, Range $b) {
if $a.min <= $b.max && $b.min <= $a.max {
($a.min < $b.min ?? $a.min !! $b.min)..($a.max < $b.max ?? $a.max !! $b.max)
} else {
($a|$b)
}
}
有没有一种简单的方法可以将 Type 约束添加到 sub 以说它可以返回 aRange
或 a Junction
?
以为我已经包括
- Multi sub 在 where 子句中进行检查。
- 子集
Any
。 - 始终返回一个连接并只使用 one() (但我想保持可能的范围)
但是,如果有人能想到一种更简单的方法。
解决方案
只需创建一个容纳这两种结果的子集,并将其用作一种类型。
请注意,由于Junction不是Any的子类型,因此您必须将其标记为Mu。
(Junction特别不能是Any并且按照它的方式工作)
my subset Range-or-Junction of Mu where Range|Junction;
proto sub foo ( Range, Range --> Range-or-Junction ) {*}
multi sub foo (Range $a,Range $b where $a.min ~~ $b || $a.max ~~ $b --> Range){
# note that this is wrong as it doesn't takes into consideration
# :excludes-min or :excludes-max
min($a.min,$b.min) .. max($a.max,$b.max)
}
multi sub foo (Range $a,Range $b --> Junction){
$a | $b
}
推荐阅读
- python-3.x - 如何根据数据框python的前一行更新行
- apache-kafka - Kafka Streams 是否可能在不同节点有不同的上下文时间?
- regression - 将 teffects 结果从 Stata 输出到 Excel 的最佳方法?
- sql - 如何以格式 00:00:00 为时间列格式化时间值
- android - 我正在使用带有gridview的cardview,在设计面板中我的编码输出还可以,但是当我在任何Android手机上运行它时它都无法正常工作
- c - C语言问答游戏倒计时
- swift - SwiftUI 中的条件动画停止工作
- .net-core - 如何使用实体框架核心和单元测试来做 UnitOfWork + Repository 模式
- vb.net - 是否有 Outlook GlobalAppointmentID 结构?
- encryption - 通过暴力破解 pbkdf2_sha256 的可能性