9
4

5 回答 5

7

你在中间转错了方向。重要的部分是nqp::existskey所谓的:k.WHICH. 该方法适用于值类型,即不可变类型,其中值(而不是身份)定义了两个事物是否应该是同一事物(即使创建了两次)。它返回一个对象值的字符串表示形式,该值对于应该相等的两个事物是相等的。为<1>.WHICH你得到IntStr|1,为1.WHICH你得到公正Int|1

于 2016-11-26T05:47:44.883 回答
4

Set文档中所述,集合比较对象身份,与===运算符相同:

在一个 Set 中,每个元素都保证是唯一的(从某种意义上说,没有两个元素会与 === 运算符进行正面比较)

对象的身份由.WHICH方法定义,正如 timotimo 在他的回答中所阐述的那样。

于 2016-11-26T14:46:50.503 回答
2
于 2016-11-27T04:50:47.310 回答
1

只是为了添加其他答案并指出集合和对象哈希之间的一致性。

对象哈希被声明为my %object-hash{Any}。这有效地散列对象.WHICH方法,这类似于集合区分单个成员的方式。

用对象哈希替换集合:

my %obj-hash{Any};

%obj-hash< 1 2 3 4 > = Any;
say "hash: ", %obj-hash.keys.perl;
say "4 is in hash: ", %obj-hash{4}:exists;
say "IntStr 4 is in hash: ", %obj-hash{ IntStr.new(4, "Four") }:exists;
say "IntStr(4,...) is 4: ", IntStr.new(4, "Four") == 4;
say "5 is in hash: ", %obj-hash{5}:exists;

给出与原始示例类似的结果:

hash: (IntStr.new(4, "4"), IntStr.new(1, "1"), IntStr.new(2, "2"), IntStr.new(3, "3")).Seq
4 is in hash: False
IntStr 4 is in hash: True
IntStr(4,...) is 4: True
5 is in hash: False
于 2016-11-27T18:33:57.037 回答
1

我认为这是一个错误,但不是在设置的东西中。其他答案对于找出重要的和不重要的非常有帮助。

我使用了引号单词的尖括号形式。引用词形式应该等同于引用版本(即 True under eqv)。这是文档示例:

<a b c> eqv ('a', 'b', 'c')

但是,当我用一个全是数字的词来尝试这个时,它就坏了:

 $ perl6
 > < a b 137 > eqv ( 'a', 'b', '137' )
 False

但是,其他形式的工作:

> qw/ a b 137 / eqv ( 'a', 'b', '137' )
True
> Q:w/ a b 137 / eqv ( 'a', 'b', '137' )
True

尖括号词引用使用IntStr

> my @n = < a b 137 >
[a b 137]
> @n.perl
["a", "b", IntStr.new(137, "137")]

没有单词引用,数字单词出现为 [Str]:

> ( 'a', 'b', '137' ).perl
("a", "b", "137")
> ( 'a', 'b', '137' )[*-1].perl
"137"
> ( 'a', 'b', '137' )[*-1].WHAT
(Str)
> my @n = ( 'a', 'b', '137' );
[a b 137]
> @n[*-1].WHAT
(Str)

当有两条代码路径可以获得最终结果而不是共享代码很早就收敛到一条路径时,您通常会看到这类错误。如果我想追踪它,这就是我要寻找的东西(但是,我需要在这本书上工作!)

但是,这确实突出了您必须非常小心集合。即使此错误已修复,也有其他非错误的方法eqv可能会失败。我仍然会失败,因为 4 as Int不是“4” as Str。我认为这种对数据类型的关注程度在 DWIMery 中是不恰当的。这当然是我必须在课堂上非常仔细地解释并且仍然看到每个人都搞砸的事情。

对于它的价值,我认为结果gist过于简单化往往会产生误导,有时结果perl不够丰富(例如隐藏Str迫使我这样做.WHAT)。我使用的越多,我发现它们的用处就越少。

但是,如果我在开始之前就知道自己搞砸了,那会让我免于那些最终毫无意义的代码探索!

于 2016-11-26T23:29:35.113 回答