我可以在一行上写多个 raku Type 智能匹配吗

Can I write multiple raku Type smart matches on one line

我知道这行不通,因为我试过了:

if $r ~~ BearingTrue || CompassAdj || CourseAdj { nextsame };

但是 - 是否有一种简洁、简洁和易读的方法可以在一行中执行多个类型 smart matches 而不必扩展为 given/when 或 if/else 结构?

你试过了吗:

if $r ~~ BearingTrue | CompassAdj | CourseAdj { nextsame };

这应该给你一个 Any Junction 与 then match OK。

这个答案是为了让我更清楚地解决@jubilatious1 的评论。

我正在开发一个新的 raku 模块,请在此处查看第 225 行 Physics::Navigation

出于说明目的,代码现在如下所示...

class BearingTrue { ...}
class BearingMag  { ...}

sub err-msg { die "Can't mix BearingTrue and BearingMag for add/subtract!" }

class BearingTrue is Bearing is export {

    multi method compass { <T> }                        #get compass

    multi method compass( Str $_ ) {                    #set compass
        die "BearingTrue compass must be <T>" unless $_ eq <T> }

    method M {                                          #coerce to BearingMag
        my $nv = $.value + ( +$variation + +$deviation );
        BearingMag.new( value => $nv, compass => <M> )
    }

    #| can't mix unless BearingMag 
    multi method add( BearingMag ) { err-msg }
    multi method subtract( BearingMag ) { err-msg }
}

所以我决定重写代码以使用多方法加减法来检查类型匹配,以防止迷路的水手将磁力轴承添加到真正的水手上。我觉得这甚至比 Scimon 的好答案更清晰,因为在那种情况下,我的方法是接受 Bearing 的所有子类型,然后使用 if 语句来检测类型错误。

欢迎你去...

zef install https://github.com/p6steve/raku-Physics-Navigation.git

然后按照 bin/synopsis-navigation.raku 顶部的示例使用该模块,并在您自己的代码中使用各种 类。

如果您只是想看看这些片段是如何组合在一起的,那么我建议您自己编写简单的 类 类似的代码,并研究 ThinkRaku 第 12 章等书籍中的示例。我建议这是为了信息的清晰度和水平,它平等对待继承和角色。

我相信其他人会觉得我的代码风格过于依赖继承。我觉得由于磁轴承严格来说是一般轴承的派生概念,所以这对我的代码来说是正确的——但角色和组成的限制较少,并提供类似的封装和更好的可维护性。