Raku 编程/连接
外观
< Raku 编程
连接最初是作为 Perl 模块的一部分实现的,目的是简化一些常见操作。假设有一个复杂的条件,需要将变量 $x
与多个离散值进行比较
if ($x == 2 || $x == 4 || $x == 5 || $x == "hello"
|| $x == 42 || $x == 3.14)
这是一个很大的混乱。我们想要做的是创建一个值列表,并询问“如果 $x
是这些值中的一个”。连接允许这种行为,但可以做更多的事情。以下是相同的语句,写成连接
if ($x == (2|4|5|"hello"|42|3.14))
有 4 种基本类型的连接:any(所有组件的逻辑 OR),all(所有组件的逻辑 AND),one(所有组件的逻辑 XOR),以及 none(所有组件的逻辑 NOR)。
列表操作符将连接构建为列表
my $options = any(1, 2, 3, 4); # Any of these is good
my $requirements = all(5, 6, 7, 8); # All or nothing
my $forbidden = none(9, 10, 11); # None of these
my $onlyone = one(12, 13, 4); # One and only one
指定连接的另一种方法是使用我们已经见过的中缀操作符
my $options = 1 | 2 | 3 | 4; # Any of these is good
my $requirements = 5 & 6 & 7 & 8; # All or nothing
my $onlyone = 12 ^ 13 ^ 4; # One and only one
请注意,没有中缀操作符来创建 none()
连接。
连接与 Raku 中的任何其他数据类型一样,可以使用 智能匹配 运算符 ~~
进行匹配。运算符会根据正在匹配的连接类型自动执行正确的匹配算法。
my $junction = any(1, 2, 3, 4);
if $x ~~ $junction {
# execute block if $x is 1, 2, 3, or 4
}
if 1 ~~ all(1, "1", 1.0) # Success, all of them are equivalent
if 2 ~~ all(2.0, "2", "foo") # Failure, the last one doesn't match
只有当 all()
连接中的所有元素都与对象 $x
匹配时,才会匹配。如果任何元素不匹配,则整个匹配失败。
one()
连接只有当且仅当其中一个元素匹配时才会匹配。多于或少于一个,整个匹配都会失败。
if 1 ~~ one(1.0, 5.7, "garbanzo!") # Success, only one match
if 1 ~~ one(1.0, 5.7, Int) # Failure, two elements match
只要 至少一个 元素匹配,any()
连接就会匹配。它可以是一个或多个,但不能为零。any
连接失败的唯一情况是所有元素都不匹配。
if "foo" ~~ any(String, 5, 2.18) # Success, "foo" is a String
if "foo" ~~ any(2, Number, "bar") # Failure, none of these match
none()
连接只有当连接中的所有元素都不匹配时才成功。这样,它等同于 any()
连接的逆。如果 any()
成功,则 none()
失败。如果 any()
失败,则 none()
成功。
if $x ~~ none(1, "foo", 2.18)
if $x !~ any(1, "foo", 2.18) # Same thing!