首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl6:比较算子~~

Perl6:比较算子~~
EN

Stack Overflow用户
提问于 2018-01-28 16:08:22
回答 2查看 445关注 0票数 14

我不明白这种行为:

代码语言:javascript
复制
> sort([1,2,3,4]) ~~ sort([1,2,3,4])
False

你能给我解释一下吗?根据Perl 6,这两个列表(显然是相等的)为什么不相等。

更新

很有趣,但它取决于Perl6版本(我刚刚注意到了):

代码语言:javascript
复制
$ which perl6
/usr/bin/perl6
$ dpkg -S `which perl6`
rakudo: /usr/bin/perl6
$ perl6 --version
This is perl6 version 2015.11 built on MoarVM version 2015.11
$ perl6
> sort([1,2,3]) ~~ sort([1,2,3])
True
> 
$ export PATH=~/.rakudobrew/bin:$PATH
$ perl6 --version
This is Rakudo version 2017.12 built on MoarVM version 2017.12.1
implementing Perl 6.c.
$ perl6
To exit type 'exit' or '^D'
> sort([1,2,3]) ~~ sort([1,2,3])
False
> 

关于#perl6 6的讨论:

代码语言:javascript
复制
[19:35] <+committable6> AlexDaniel, 
¦2015.12,2016.01.1,2016.02,2016.03,2016.04,2016.05,2016.06,2016.07.1,2016.08.1,2016.09,2016.10,2016.11,2016.12: «True␤» 
¦2017.01,2017.02,2017.03,2017.04.3,2017.05,2017.06,2017.07,2017.08,2017.09,2017.10,2017.11,2017.12,2018.01,HEAD(8afd791): «False␤»

返回True (第1行)和False (第2行)的版本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-28 17:22:59

关键的观察是,sort实际上并没有返回列表:

代码语言:javascript
复制
> sort([1,2,3,4]).^name
Seq

分类文档似乎已经过时了。我会尽快解决的。

因此,序列号是一个序列,基本上是一个迭代器,您也可以尝试像列表一样使用它。

但是,在默认模式下,当您迭代一个Seq时,它不会存储旧元素,主要是为了启用以下代码

代码语言:javascript
复制
for $filehandle.lines -> $line {
    # do something with $line here
}

不会泄露记忆。(这与python的迭代器相当。)

因此,这可能是为什么没有人实现Seq.ACCEPTS (智能匹配操作符~~在正确的参数上调用ACCEPTS )来按照您在本例中的预期行事,因为这可能是一种破坏性操作。因此,默认的ACCEPTS行为将开始,这将进行身份比较,并返回False

如果您将代码更改为

代码语言:javascript
复制
> sort([1,2,3,4]) ~~ sort([1,2,3,4]).list
True

它的行为方式是你想要的。

我将与其他Perl 6开发人员讨论是否可以将Seq.ACCEPTS更改为更明智的行为。

票数 14
EN

Stack Overflow用户

发布于 2018-01-28 17:24:51

您所写的文字是Array的:

代码语言:javascript
复制
say WHAT [1,2,3,4] ; # (Array)

普通的Array被急切地评估,因此它们的内容在任何时候都是已知的。因此,当应用于具有相同类型和内容的~~ s时,True运算符将生成True

代码语言:javascript
复制
say [1,2,3,4] ~~ [1,2,3,4] ; # True

但是您正在应用一个函数,因此您必须注意该函数返回的内容。

函数返回一个Seq,一个序列,这是一个根本不同的类型。

Seq是惰性评估的,所以它们的内容直到它们被完全迭代、耗尽它们之后才会被计算出来。通过两个Seq来查看它们是否等效是没有意义的,因为那样它们就会筋疲力尽。

因此,两个元素将被证明是相同的Seq本身并不相同:

代码语言:javascript
复制
say Seq.new([1,2,3,4].iterator) ~~ Seq.new([1,2,3,4].iterator) ; # False
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48488381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档