我可以在一行上写多个 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 章等书籍中的示例。我建议这是为了信息的清晰度和水平,它平等对待继承和角色。
我相信其他人会觉得我的代码风格过于依赖继承。我觉得由于磁轴承严格来说是一般轴承的派生概念,所以这对我的代码来说是正确的——但角色和组成的限制较少,并提供类似的封装和更好的可维护性。
我知道这行不通,因为我试过了:
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 章等书籍中的示例。我建议这是为了信息的清晰度和水平,它平等对待继承和角色。
我相信其他人会觉得我的代码风格过于依赖继承。我觉得由于磁轴承严格来说是一般轴承的派生概念,所以这对我的代码来说是正确的——但角色和组成的限制较少,并提供类似的封装和更好的可维护性。