免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5572 | 回复: 1
打印 上一主题 下一主题

关于perl 里类的实现的一些疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-07 17:26 |显示全部楼层 |倒序浏览
我一直对perl 里类的实现和使用有些迷糊, 书也看了, 但还是有些晕晕呼呼, 我觉得还是讨论来的快, 所以在此写一下关于我自己对perl类的理解, 希望大家能给于指点:
我的理解:
首先perl 的类就是一个包, 在这个包里定义的函数就是类的方法.
类整个的实现,是通过一个匿名hash引用实现的
通过hash 这种数据结构, 一个变量就可以映射一个复杂的数据结构, 这个变量也就是这个hash的引用.

my $self = {};
$self->{data1} = 1;
$self->{data2} = 2;
以上是数据的上, hash 对类的实现,
*问题1.  那么类的方法(包里函数)怎么实现的?
是hash 里面存了 子函数的引用? 然后就可以通过这个引用来调用函数,达到了类里对方法的调用的目的?

*问题2. 为什么类的方法的第一个参数都是类本身(那个引用变量)
因为这个类整个就是一个hash ,所以如果要操作类的数据(hash的数据), 就要通过hash的引用来访问,所以在类的方法体里, 需要一个这样的变量, 来对hash本身的数据,方法进行操作. 这样理解对不? :)


sub new {
    my $class = shift;
    my $self = {};
    bless $self,$class;
    return $self;
    }

*问题3. 每个类都会有个初始化函数new, 这new 是创造这个hash的地方. 但为啥也要先shift 一个class, 这个时候,那个承载类的hash应该还没有创建吧, 这个shift ,会得到什么? 还是根本就没用, 只是声明了个变量?

问题4. 哪位明白的高人,给解释一下bless, 是干啥的,  如果以上代码这样写
sub new {
    my $class = shift;
    my $self = {};
    $class = $class;
    return $self;
    }
效果是不是一样呢?

大概就这些困惑吧, 主要是对perl里类的实现机制没个清晰的把握, 希望已经明白的, 有经验的兄弟或姐妹能深入的谈一下, 自己的理解 , 谢谢了

希望讨论使大家对perl 的类有一个更清晰的理解, 能够对困惑, 迷糊朋友有所帮助!!

论坛徽章:
0
2 [报告]
发表于 2006-12-08 17:06 |显示全部楼层

谢谢 flw 兄的指点

关于指点1 我理解:
$object = new Class;
$object -> sub_a();

$object 就是这个类的对象 , sub_a() 时类的方法
"->" 把$object  unshift  到 sub_a() 的参数列表里,
所以在sub_a () 函数体里
sub_a(){
  my $self = shift ;
}
这个$self 这么样, 就是类的本身了
"->" 的功能原理真是神奇!

关于第3个问题:
"问题3的回答:
new 的第一个参数是 $class,不是 $self,也就是说,new 的第一个参数是类名称,而不是对象,...."
构造函数new 的第一个参数就是类的名字, 一个字符串.
用这个名字,通过bless 给那个hash 引用打上一个标签.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP