13

在 Perl 中,对任何事物的引用都是一个简单的标量,并且有$符号。有时很难说它是什么类型的参考。

我个人为引用的变量名称加上一个字母,表示引用类型。例子:

my $aValues = [];                # arrayref
my $hValue  = {};                # hashref
my $oValue  = bless {};          # object
my $sValue  = \(my $s = 'foo');  # scalarref
...

我见过这种符号的支持者和反对者。你用它吗?它有什么缺点吗?

4

5 回答 5

18

嗯。Arrayrefs 和 hashrefs 之类的东西在这里并不会令人困惑,因为我们的 Perl 数据类型经常出现这个问题。(另外:$oValue?你能有多通用?它是什么类型的对象?)

给我语义单位的匈牙利符号:$size_bits, $size_bytes, $size_kb, $size_blocks, $size_mb, $size_gb. 底层数据类型?不如每秒增加 3 个字节到 10 兆字节并获得 13 个字节重要。就是某种形式的匈牙利表示法有用的地方。

于 2010-01-25T22:05:33.787 回答
16

就我个人而言,我发现匈牙利符号很难阅读。我只使用英语约定:

my $values; # is an array
my $value;  # is a scalar
my $value_hash; # is a hash

我通常将对象视为与标量相同,因为它的使用方式很明显它是一个对象。但是,如果我发现需要我会使用:

my $value_obj;  # is an object
于 2010-01-25T21:57:10.327 回答
10

如果你想要静态类型的语言,你知道在哪里可以找到它们......

但是匈牙利符号从来没有打算与技术数据类型有关(尽管它的大部分不良代表被误解并应用于技术数据类型)。最初发明它的匈牙利人 (Charles Simonyi) 打算用它来传达语义信息,例如在处理表的代码中使用row和前缀,这样您就不会混淆行索引和列索引。col

于 2010-01-25T22:13:37.620 回答
6

匈牙利符号的目的是嵌入语义注释

  • 不能以其他方式在语言中表达,尤其是类型系统和
  • 从上下文中看不出来

在变量名中。现在,由于 Perl 没有静态类型系统,看起来匈牙利符号应该相当普遍。但是,以匈牙利符号的价值为例:跟踪不受信任数据的来源。

匈牙利表示法的一个经常被引用的例子是在应用程序中的所有字符串变量前面加上sor u(用于安全不安全),这取决于字符串是来自受信任的来源(或已被清理)还是来自不受信任的来源。但是:只需将unsafe替换为tainted,您就可以完美地描述 Perl 中的 tainting。因此,在这种情况下,即使 Perl 没有静态类型系统,它也有一个动态的允许您在语言中表达受信任/不受信任的语义的类型系统,因此匈牙利符号是多余的。(即使在没有内置支持污染的语言中,通常也有更好的方法,例如子类型(Python、Ruby、Smalltalk,...),注释/属性(Java,C#,...),元数据(Clojure,...)和静态类型(Haskell,ML,...)。)

此外,Perl 非常具有表达力,因此将变量的整个上下文保留在您的脑海中(或在一屏代码中)要容易得多,因此,语义从周围的代码中通常是显而易见的。

当然,好的命名也有帮助。

请记住:匈牙利符号是为 C 发明的,它没有表现力,并且具有静态类型系统,其几乎唯一的用途是作为笑话的妙语。

于 2010-01-26T00:41:47.357 回答
4

我不这样做是因为引用的用法会清楚地说明它的含义。例如:

$a->{key};  # hash
... if @$b; # array
$c->foo;    # object

为变量选择能够传达它们所代表内容的名称将大有帮助。Perl 是由一位语言学家设计的,并且借鉴了自然语言,因此上下文是关键。我们的大脑已经准备好进行这种处理。在你的代码结构中使用它!

于 2010-01-25T21:58:02.257 回答