【问题标题】:Named parameters in PerlPerl 中的命名参数
【发布时间】:2012-10-09 08:55:59
【问题描述】:

我正在尝试在 Perl 中使用命名参数。我一直使用http://perldesignpatterns.com/?NamedArguments 作为参考。

这似乎是有道理的。但是,我似乎无法真正获取传入的值。

我也尝试过更改为$args{'name'}$args{"name"},但没有成功。我似乎无法获取传入的值。我需要查看哪个方向才能弄清楚到底发生了什么?

文件 doh.pm

package doh;
sub new ()
{
   my %args = @_;
   $name = $args{name};
   print $name;
}
1;
__END__

文件 test.pl

use warnings;
use doh;
$trial = doh::;
$trial->new(name => "Tyson");

运行 test.pl 时不打印输出。

【问题讨论】:

  • $trial = doh::; $trial->new 是一种奇怪的做法 doh->new!!!
  • 好在 Perl 忽略了方法上的原型,因为你的原型是错误的。摆脱它!
  • 在非常简单的层面上,我使用“$trial = doh::”的原因是因为我有一些东西设置,doh 可以用另一个包替换,但另一个包包含相同的功能/过程/方法。而不是必须用 duh 替换 doh-> (在整个脚本中),我认为使用通用名称作为 $ 并将其视为别名会更“可读” (如果这是正确的术语)包。我经常使用 perl 编写脚本,但更多的 OO 和它的其他细节我还没有完全了解其中的细微差别。
  • 很明显我没有展示我正在使用的实际脚本,但我真的不能因为工作。我会问你所说的“我的原型是错误的”ikegami 是什么意思。同样在昨天之前,我什至不知道您可以执行“$trial = doh::;”我刚试了一下,它做了一些我想做的事情。
  • 你在new 上给出了一个原型,告诉 Perl 它不接受任何参数。这显然不是真的。

标签: perl parameter-passing


【解决方案1】:

我不确定你想用 $trial = doh::; 做什么,但你的主要问题是你试图在处理你的方法调用者之前处理参数。

首先,开始每个 Perl 文件

use strict;
use warnings;

是的,两者都需要。

当在 Perl 中调用方法时(与普通子例程相反),-> 运算符左侧的东西(invocant)被推到参数列表的开头。因此,您需要先将其从列表中删除。对于您的构造方法,调用者通常是类名。对于实例方法,它将是对象本身。所以

sub new {
    my $class = shift;
    my %args = @_;

    print "name is: $args{name}\n";
}

(如果你不想使用shift,你也可以写my ( $class, %args ) = @_;

对于实例方法,约定是将变量命名为$self

还请注意,我已经删除了子例程名称后面的括号;这些对于 OO 方法没有任何功能,而且它们可能不会按照您的想法做。

【讨论】:

  • 当然,考虑到 OP 的代码并不是真正的对象构造函数,根本没有理由在其中使用 OOisms。
  • 嗯,是的,但我想他最终想把它变成一个构造函数。 :)
  • 他完全称它为一种方法,这是他的问题。
猜你喜欢
  • 1970-01-01
  • 2018-09-18
  • 2012-11-13
  • 2012-06-22
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
相关资源
最近更新 更多