为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Perl 5的函数原型不好?

为什么Perl 5的函数原型不好?

为什么Perl 5的函数原型不好?在……里面另一个堆栈溢出问题 利昂·蒂默曼斯断言:我建议你不要使用原型。他们有他们的用途,但在大多数情况下,肯定不是在这一个。为什么这可能是真的(或其他)?我几乎总是为我的Perl函数提供原型,而且我以前从未见过其他人说过关于使用它们的坏话。
查看完整描述

5 回答

?
慕虎8459273

TA贡献4条经验 获得超0个赞

这个函数原型是什么什么用的?

查看完整回答
反对 回复 2019-06-20
?
慕虎8459273

TA贡献4条经验 获得超0个赞

这个函数原型是什么做什么用的?

查看完整回答
反对 回复 2019-06-20
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

如果正确使用,原型并不坏。困难在于Perl的原型不像人们通常期望的那样工作。在其他编程语言中有背景的人倾向于期望原型提供一种机制来检查函数调用是否正确:也就是说,他们有正确的参数数量和类型。Perl的原型并不适合这个任务。是因为误用那太糟了。Perl的原型有一个独特和非常不同的目的:

原型允许您定义像内置函数一样的函数。

  • 括号是可选的。
  • 上下文是强加在论点上的。

例如,可以定义如下函数:

sub mypush(\@@) { ... }

并称之为

mypush @array, 1, 2, 3;

不需要编写\若要对数组进行引用,请执行以下操作。

简而言之,原型允许您创建自己的语法糖。例如,Moose框架使用它们来模拟更典型的OO语法。

这是非常有用的,但原型非常有限:

  • 它们必须在编译时可见。
  • 他们可以被绕过。
  • 将上下文传播到参数可能会导致意外行为。
  • 除了严格规定的形式之外,它们还会使调用函数变得困难。

看见原型所有血淋淋的细节。


查看完整回答
反对 回复 2019-06-20
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

问题是Perl的函数原型并不像人们想象的那样。它们的目的是允许您编写像Perl内置函数那样解析的函数。

首先,方法调用完全忽略原型。如果您正在进行OO编程,那么您的方法有什么原型并不重要。(所以他们不应该有任何原型。)

第二,原型没有严格执行。如果您使用&function(...),原型被忽略了。所以他们不能提供任何类型的安全。

第三,他们是恐怖的远程行动。(特别是$Prototype,它导致在标量上下文中计算相应的参数,而不是默认的列表上下文。)

特别是,它们使得很难从数组中传递参数。例如:

my @array = qw(a b c);foo(@array);foo(@array[0..1]);foo($array[0], $array[1], $array[2]);sub foo ($;$$) 
{ print "@_\n" }foo(@array);foo(@array[0..1]);foo($array[0], $array[1], $array[2]);

指纹:

a b c
a b
a b c3b
a b c

还有3条警告main::foo() called too early to check prototype(如果启用了警告)。问题是,在标量上下文中计算的数组(或数组片)返回数组的长度。

如果您需要编写一个功能类似于内置的函数,请使用原型。否则,不要使用原型。

注意:Perl 6将进行完全修改,并且非常有用的原型。这个答案只适用于Perl 5。


查看完整回答
反对 回复 2019-06-20
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

我同意以上两张海报。一般来说,使用$应该避免。只有在使用块参数(&),球体(*),或参考原型(\@\$\%\*)


查看完整回答
反对 回复 2019-06-20
  • 5 回答
  • 0 关注
  • 633 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信