gpt4 book ai didi

Perl:散列键丢失了它们的类信息

转载 作者:行者123 更新时间:2023-12-04 22:25:13 24 4
gpt4 key购买 nike

我有一个带有 X.pm 方法的包 data_x();例如,我使用 X 类的实例作为哈希 %seen 的键。
现在keys %seen的元素似乎已经忘记了他们的祝福:

use X;

my( $x, $y, %seen );

$x = X->new();
$x->data_x( 1 );

print " x: ", $x, "\n";
print " x.data: ", $x->data_x(), "\n";

$seen{ $x } = 1;
$y = (keys %seen)[0];

print " y: ", $y, "\n";
print " y.data: ", $y->data_x(), "\n";

这打印:
 x:      X=HASH(0x228fd48)
x.data: 1
y: X=HASH(0x228fd48)
Can't locate object method "data_x" via package "X=HASH(0x228fd48)"
(perhaps you forgot to load "X=HASH(0x228fd48)"?) at test.pl line 15.
$x$y 都指向同一个地址,但显然 keys 没有复制类信息。
为什么会这样?

最佳答案

他们不仅失去了祝福,他们甚至不再是 hashrefs。

在 Perl 中,您只能使用字符串作为哈希键。

所有不是字符串的东西都将变成字符串。所以散列中的键不再是一个对象,而是字符串 'X=HASH(0x228fd48)'(这是一个有福的 hashref 在打印时的样子)。没有办法从那个字符串中取回对象(除非你有另一个散列将这些键映射到原始对象)。

您需要使用唯一标识符作为哈希键。看来您可以使用当前的字符串版本(基本上是一个内存地址)来至少检查对象身份(对象在事件时似乎不会移动),但我不确定这会有多稳定be(不过,一些由内而外的对象的实现似乎基于这个想法),并且它不会为您提供对象相等性检查。

关于Perl:散列键丢失了它们的类信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4039826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com