Perl 6 似乎有大量的相等运算符。是什么=:=
?leg
和有什么区别cmp
?或者eqv
和===
?
谁有好的总结?
=:=测试两个容器(变量或数组项或散列项)是否有别名,即如果一个更改,另一个是否也更改?
my $x;
my @a = 1, 2, 3;
# $x =:= @a[0] is false
$x := @a[0];
# now $x == 1, and $x =:= @a[0] is true
$x = 4;
# now @a is 4, 2, 3
至于其他:===测试两个引用是否指向同一个对象,eqv测试两个事物是否在结构上等价。所以[1, 2, 3] === [1, 2, 3]
会是假的(不是同一个数组),但[1, 2, 3] eqv [1, 2, 3]
会是真的(相同的结构)。
leg
比较像 Perl 5's 这样的字符串cmp
,而 Perl 6'scmp
更智能,并且会比较数字 like<=>
和字符串 like leg
。
13 leg 4 # -1, because 1 is smaller than 4, and leg converts to string
13 cmp 4 # +1, because both are numbers, so use numeric comparison.
最后~~
是“智能匹配”,它回答了“$x
匹配$y
”的问题。如果$y
是类型,则为类型检查。如果$y
是正则表达式,则它是正则表达式匹配 - 等等。
概要 3:比较语义中的摘要是否符合您的要求,或者您是否已经阅读过?设计文档链接到使用这些功能的测试文件,因此您可以查看它们的使用示例及其当前测试状态。
Perl 6 的比较运算符更适合动态语言和所有正在发生的事情。不再只是比较字符串或数字(或将事物转换为字符串或数字),现在您可以使用符合您要求的运算符精确地测试事物。您可以测试值、容器、类型等。
在其中一条评论中,您询问了eqv
and cmp
。在 Perl 5 的旧时代,cmp
它用于排序并返回三个魔法值之一(-1,0,1),并且它总是使用字符串语义来做到这一点。在 Perl 6 中,cmp
返回三种类型的Order
对象之一,因此您不必记住 -1、0 或 1 的含义。此外,新的cmp
不强制字符串语义,所以它可以更聪明地处理数字(不像 Perl 5 的排序为 1、10、11、2、20、21 ...)。
(小于leg
,等于,大于)是字符串语义。它被定义为 Perl 6's ,其中是强制字符串语义的新“字符串上下文化器”。使用,您总是在进行字符串比较,就像旧的 Perl 5 一样。cmp
~$a cmp ~$b
~
leg
cmp
如果您对其他运营商仍有疑问,让我们将它们分解为单独的问题。:)
这也是一个方便的参考指南: