tjw*_*992 2 methods perl module class
我注意到一些Perl模块使用基于类的结构,但不管理任何数据.该类仅用于访问其中的方法,仅此而已.
请考虑以下示例:
Class.pm
package Class;
use Moose;
sub do_something {
print "Hi!\n";
}
1;
Run Code Online (Sandbox Code Playgroud)
test.pl
use Class;
# Instantiate an object from the class
my $obj = Class->new();
$obj->do_something();
Run Code Online (Sandbox Code Playgroud)
在此示例中,您可以看到首先实例化该类的实例,然后从创建的对象中调用该方法.
可以像这样实现相同的最终结果:
Module.pm
package Module;
use strict;
use warnings;
sub do_something {
print "Hi!\n";
}
1;
Run Code Online (Sandbox Code Playgroud)
test.pl
use Module;
Module::do_something();
Run Code Online (Sandbox Code Playgroud)
我想知道为什么人们使用第一种方法编写模块,并且如果它提供了一些好处.对我来说,似乎它增加了一个额外的步骤,因为为了使用这些方法,首先需要实例化该类的对象.
我不明白为什么人们会像这样编程,除非它有一些我没有看到的好处.
一个好处是继承.如果它支持->
样式子例程调用,则可以子类化现有类的行为(这是一个较弱的语句,而不是说该类是面向对象的,正如我在上面的注释中所说的那样).
package Class;
sub new { bless \__PACKAGE__,__PACKAGE__ }
sub do_something { "foo" }
sub do_something_else { 42 }
1;
package Subclass;
@Sublcass::ISA = qw(Class);
sub new { bless \__PACKAGE__,__PACKAGE__ }
sub do_something_else { 19 }
package main;
use feature 'say';
$o1 = Class->new;
$o2 = Subclass->new;
say $o1->do_something; # foo
say $o2->do_something; # foo
say $o1->do_something_else; # 42
say $o2->do_something_else; # 19
Run Code Online (Sandbox Code Playgroud)
这种技术的一个突出用途是UNIVERSAL
类,所有祝福的引用都隐式地子类化.UNIVERSAL
命名空间中定义的方法通常将包名称作为第一个参数(或者将第一个参数中的引用解析为其包名称),返回一些包信息.该DB
班也做这样的事情(虽然DB
包也保持充足状态).
归档时间: |
|
查看次数: |
71 次 |
最近记录: |