跳转到内容

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
}

all() 连接

[编辑 | 编辑源代码]
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() 连接

[编辑 | 编辑源代码]

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() 连接就会匹配。它可以是一个或多个,但不能为零。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() 连接

[编辑 | 编辑源代码]

none() 连接只有当连接中的所有元素都不匹配时才成功。这样,它等同于 any() 连接的逆。如果 any() 成功,则 none() 失败。如果 any() 失败,则 none() 成功。

if $x ~~ none(1, "foo", 2.18)
if $x !~ any(1, "foo", 2.18)    # Same thing!
华夏公益教科书