加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl 的Class::MethodMaker

发布时间:2020-12-15 21:00:15 所属栏目:大数据 来源:网络整理
导读:看到perl inter 进展缓慢,不过也不着急,看看这个模块的文档吧,虽然现在有很多OO的模块,我先看这个的。 基础牢固了再去看那些复杂的,后面想看看anyevent,template tootkit,dancer,mojo,catalyst,PSGI/Plack.好多啊.... 大概翻译如下,有点混乱。 名称:

看到perl inter 进展缓慢,不过也不着急,看看这个模块的文档吧,虽然现在有很多OO的模块,我先看这个的。

基础牢固了再去看那些复杂的,后面想看看anyevent,template tootkit,dancer,mojo,catalyst,PSGI/Plack.好多啊....

大概翻译如下,有点混乱。

名称:

Class::MethodMaker -为perl面向对象编程创建泛型方法。

内容简介:

 use Class::MethodMaker
    [ scalar => [qw/ foo bar baz /],new    => [qw/ new /],];

都是 use??Class::MethodMaker

? ? ? ? [

componet => [option,'method' ],

]

这种形式,下面具体介绍一下 组件,选项,方法名称是自己设置的。


描述:

This?module?solves?the?problem?of?having?to?continually?write?accessor?methods?for?your?objects?that?perform?standard?tasks.

本模块能解决如下问题:不断给对象编写辅助方法(如set_sth?get_sth),减少工作量。

The?argument?to?'use'?is?an?arrayref,?as?pairs?whose?"keys"?are?the?names?of?types?of?generic?methods?generated?by?MethodMaker?and?whose?"values"?tell?method?maker?what?methods?to?make.

Use的参数?是一个数组引用,数组中参数成对出现,键是泛型方法的类型名,值是告诉方法创造者创造什么方法。

To?override?any?generated?methods,?it?is?sufficient?to?ensure?that?the?overriding?method?is?defined?when?Class::MethodMaker?is?called.?Note?that?the?use?keyword?introduces?a?BEGIN?block,?so?you?may?need?to?define?(or?at?least?declare)?your?overriding?method?in?a?BEGIN?block.

为了重载任意继承的方法,它充分保证了重载的方法会在?Class::MethodMaker被调用时被定义。注意:use关键字接受一个BEGIN块,所以你需要定义你重载的方法在BEGIN块里。

简单用法:

一个简单的使用Class::MethodMaker的类如下:

??package?MyClass;

use?Class::MethodMaker

????[?scalar?=>?[qw/?name?/],

??????new????/?new??/];

所创建的类,使用new?创建实例,每个实例有一个?叫name的?标量组件。?使用方法name,name_reset?name_isset?可以?查询,设置或重置?name

package?mainmy?$m?=?MyClass->new$n??$?=?"n"print?$m->name_isset???"true"?:?"false";?????#?false

??->name("foo");

$n?=?->nameprint?defined?"->$n<-"?"*undef*"#?->foo<-

#?true

(undef#?*undef*

->name_reset#?false

可用的组件类型包括?scalararrayhash。还有几种非数据类型的用法:new(构造器),deep_copy?copy(对象拷贝),?abstract(创建抽象方法(纯虚函数))

由于pod上没有介绍非数据类型的选项配合方法,下面是数据类型组件的一些选项:

?需要参数的选项,用{}括起来,不需要的参数的如static 可以直接单独写出,这些选项作用于最近的一个方法;

多个方法可以连续写在一个里面;


每个组件(数据组件)有一些选项:?

-static?每个类而非每个实例的数据。

-type?规定数据的类型??type后面接?类名。

-forward??调用?数据对象的相应方法

package?X[scalar?[{?-type?=>?'File::stat',238)">??????????????????-forward?/?mode?size?/},238)">????????????????'st1'???????????????])},238)">Package?main;

use?File::stat;?

my?$a=?X->new;?

my?$file=stat(“/etc/tmp”);

$a->stl($file);

$a->size;?#?forward?to?$file->size;

-default/-default_ctr?设置默认值,默认的coderef

-read_cb/-store_cb?(略)


最后附上自己的测试代码:

 use File::stat;
 use strict;
{
package animal;
 use File::stat;
use Class::MethodMaker [
    new => [qw(new)],array => 'ab',scalar => [  +{-default => 'brown'},'color',qw(height age name )],scalar => [ { -type => 'File::stat',-forward=>[qw/mode size/]
				 },'hehe',],abstract =>[qw(sound)],];

sub named {
	my $self = shift->new;
	$self->name(shift);
	$self;
}
sub speak{
	my $self = shift;
	print $self->name,' goes ',$self->sound,"n";
}
sub eat{
	my $self = shift;
	my $food = shift;
	print $self->name," eats $food n";
}
}
local $ ="n";
my $a= animal->named('lily');
print $a->name,"n";
print $a->ab(1,4),"n";
$a->eat("banana");
print $a->color;
my $w= stat("d://1.txt");
$a->hehe($w);
print $a->size;

总结:

? ? ?看的头晕眼花,四肢乏力,这个模块确实节约很大力气再设置accesor上面。

? ? ?不过,关于new的设置不知道是个什么情况。

? ? ? intermediate perl 159页的代码和这个有出入,也许是版本问题吧,就先不管那么多了,目的一致即可,还有更多更好的OO模块,以后慢慢学习。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读