Dav*_*d B 27 perl compare reference
我想检查两个引用是否指向同一个对象.看来我可以简单地使用
if ($ref1 == $ref2) {
# cheap numeric compare of references
print "refs 1 and 2 refer to the same thing\n";
}
Run Code Online (Sandbox Code Playgroud)
如上所述perlref,但我依稀记得看到为同一目的使用某些功能.有什么理由我不应该使用简单的数字相等测试吗?
注意我只想知道引用是否指向完全相同的对象.我不想找到比较对象内容的方法.
raf*_*afl 25
默认情况下,引用将编号为其地址.这些引用地址对于每个引用都是唯一的,因此它通常可用于相等性检查.
然而,在你表现出的片段中,你首先要确保两个$ref1和$ref2实际上的引用.否则,由于包含引用地址的常规标量,您可能会得到不正确的结果.
此外,没有什么可以保证引用numify到他们的地址.例如,对象可以使用重载来影响它们在不同上下文中返回的值.
比直接比较引用以获得数字相等性更为可靠的方法是在确保双方实际上都是引用之后使用由refaddr提供的函数Scalar::Util.
Eth*_*her 16
您正在寻找的函数是来自Scalar :: Util的 refaddr (在确保被比较的值确实是引用之后):
use Scalar::Util 'refaddr';
if ($obj1 and ref($obj1) and $obj2 and ref($obj2) and
refaddr($obj1) == refaddr($obj2))
{
# objects are the same...
}
Run Code Online (Sandbox Code Playgroud)
我必须假设你#comment的平等测试是多么便宜(=快)是有原因的.鉴于此,你应该继续使用廉价的平等测试.这是非常快,远远快eq,更何况比任何形式的深比较.
具有直接或间接重载的==运算符的对象可能会出于其自身目的而篡改测试.但是,如果是这样做,你甚至可能更喜欢它的介导的答案.
您采用哪种方法可能取决于您对对象类的了解.适用于一般情况的方法对于特定情况并不总是最佳的.你对事物的了解越多,你就可以越多地优化它 - 反过来也是如此.
因此,如果您知道自己没有使用具有适用重载的类,则没有理由在非内置库函数中运行,并且没有理由不这样做.如果你不知道重载,或者你知道它并且不希望它应用,那么也许采取缓慢的方法.
只要你理解了重载问题,就认为一种方法是正确的而另一种方法是错误的是错误的.每个都有它的目的.如果做你正在做的事总是错的,那么这个操作要么被禁止,要么至少被警告过.
你会注意到它没有那么明显.