面向对象的基本对象定义和在Perl中的使用

时间:2015-04-02 16:07:37

标签: perl oop

很抱歉打扰社区,但不幸的是我在Perl中编写代码:'(。这是关于我想要理解的OO perl代码,但我没有将所有部分放在一起。

以下是代码模板,它代表了我目前正在看的内容。以下是 MyClass

package Namespace::MyClass;
sub new($)
{
    my ($class) = @_;
    $self = { };
    bless ($self, $class);
}

sub init($$)
{
    my ($self, $param1) = @_;
    $self->{whatever} = ($param1, $param1, $param1);
}

然后以下是应该使用该类的 script.pl

#!/path/to/your/perl

require Namespace::MyClass;

my myClass = new Namespace::MyClass()

myClass->init("data_for_param1");

可能有错误,但我更感兴趣的是回答了以下问题,而不是纠正错误代码:

  • 问题组1:子定义中的“$”表示我需要提供一个参数,对吧?如果是这样,为什么新的要求一个,我不提供它?是否与脚本中的调用使用()或类似于Python的工作方式(自我隐含)?
  • 问题组2:出于前一个原因, init 子程序(这里是一个方法)声称需要两个参数?如果是这样的话,模块中的所有功能是否会以某种方式暗示自我的祝福?

我问这个是因为我在非祝福模块中看到一个$ =一个参数。

感谢您的时间。

3 个答案:

答案 0 :(得分:6)

QG1:

原型(例如" $")在Method调用中意味着完全没有

  

Method calls are not influenced by prototypes either, because the function to be called is indeterminate at compile time, since the exact code called depends on inheritance.

最有经验的Perl民众完全避免使用原型,除非他们试图模仿内置功能。一些PHBs没有经验的Perl强制要求他们使用它们的错误观念,即它们就像其他语言的原型一样。

Method调用的第一个参数是调用Method的Object(Blessed Ref)或Class Name(String)。如果您的new方法属于' Namespace :: MyClass'。

Word to the wise:Also avoid indirect Method calls.使用直接方法调用重写您的行,如下所示:my $myClass = Namespace::MyClass->new;

QG2:

您的init方法获得了$myClass作为第一个参数,因为它被称为''方法。第二个参数来自参数列表。祝福将类的名称绑定到引用,以便在看到方法调用时,它知道在哪个类中开始搜索正确的sub。如果未立即找到正确的sub,则会继续搜索类@ISA数组中指定的类。

答案 1 :(得分:2)

Don't use prototypes!他们不做你认为他们做的事。

Perl中的原型主要用于允许在不使用括号的情况下定义函数,或者允许使用数组引用的函数使用像poppush这样的数组名称。否则,原型可能会导致比大多数肥皂剧角色更多的麻烦和心碎。

答案 2 :(得分:0)

你真的想要验证参数吗?如果是这样那么这不是原型的目的。您可以尝试使用signatures,但出于某种原因,它们是新的,仍然是实验性的。有人认为缺乏稳定的签名功能是perl的一个缺陷。替代方案是CPAN并在您的subs /方法中编写明确验证params的代码。