“reftype { }”是什么意思?

7

我最近看到一些代码,这让我想起了要问这个问题。最近,我经常看到这种情况:

use Scalar::Util 'reftype';

if ( reftype $some_ref eq reftype { } ) { ... }

调用匿名哈希引用的reftype有什么作用?为什么不直接使用eq 'HASH'

你是因为刚看到我在ypath中做了这个才问的吗? - brian d foy
这也是《Effective Perl Programming》中的一项内容,我相信我在Stackoverflow的某个地方已经用ref()解释过了。reftype()即使被blessed,也会返回基本类型。 - brian d foy
1
@Brian,你的侦探技能再次成功了。 - friedo
1个回答

6

现在可以将其与“HASH”进行比较,因为这是现在返回的内容。

但不一定总是这样。

一个很好的例子是他们对编译后的正则表达式所做的更改。在旧版的Perl中,reftype是一个标量(SCALAR)。然而,从5.12开始(我相信),它现在是自己的类型REGEXP。例如:

在5.8上运行perl -MScalar::Util=reftype -e "print reftype qr//"会返回SCALAR,但在5.12上运行相同的命令会返回REGEXP

您可以从我之前提出的这个问题中看到另一个应用,只是那里使用的是ref而不是reftype。原则是相同的。

简单地说,通过将其与reftype {}进行比较,他们保证了现在和将来都是完全正确的,而不需要(我认为这是最棒的功能)在程序中硬编码另一个字符串。


2
非常清晰,谢谢。也许我会重新审视一些旧代码并添加一些只读常量,例如 $HASH_TYPE = reftype { }; - friedo
如果它在某个时候改变为ASSOCIATIVE_ARRAY呢?别担心,它不会改变。 - ysth
2
你确定在 Perl 6 中不会改变吗?毕竟它应该有一个 Perl 5 模式。此外,像 1、0、42 和其他魔法值也不会改变。但这并不意味着我们应该硬编码它们,可能会出现编译器无法捕获的拼写错误等问题。 - brian d foy
2
我认为这是最大的特点 - 你不会输错它。ARAAYAARRYARRAY一眼看起来非常相似。测试可以揭示问题,但测试问题只是治疗疾病的方法。如果你能通过做一些显然正确到不可能出错的事情来避免感染,那么你就完全避免了问题。 - Robert P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接