5 回答
你在中间转错了方向。重要的部分是nqp::existskey
所谓的:k.WHICH
. 该方法适用于值类型,即不可变类型,其中值(而不是身份)定义了两个事物是否应该是同一事物(即使创建了两次)。它返回一个对象值的字符串表示形式,该值对于应该相等的两个事物是相等的。为<1>.WHICH
你得到IntStr|1
,为1.WHICH
你得到公正Int|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
我认为这是一个错误,但不是在设置的东西中。其他答案对于找出重要的和不重要的非常有帮助。
我使用了引号单词的尖括号形式。引用词形式应该等同于引用版本(即 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
)。我使用的越多,我发现它们的用处就越少。
但是,如果我在开始之前就知道自己搞砸了,那会让我免于那些最终毫无意义的代码探索!