免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yiten
打印 上一主题 下一主题

大家讨论下Perl OO的实现方式以及特点 [复制链接]

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
1 [报告]
发表于 2011-01-14 16:07 |显示全部楼层
perl 的 OO 很容易理解,hack 着简单。不过写类的时候有点痛苦

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2011-01-22 18:01 |显示全部楼层
You can bless any reference. Nobody can touch the attributes without 'get'/'set' methods in foll ...
greencow 发表于 2011-01-21 23:01



    这个狠 {:2_170:}

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2011-01-24 13:34 |显示全部楼层
其实是把 $h 当作个集合就可以创建多个对象,保存每个对象就可以了,不过要用 weaken 加上 Readonly 效果更佳 {:2_169:}

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
4 [报告]
发表于 2011-01-25 11:15 |显示全部楼层
本帖最后由 zhlong8 于 2011-01-25 11:40 编辑

写个变态点的,不过 perl 这种解释型的语言永远有办法 hack
  1. package OO;

  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my %hash;
  6. my $id = 0;
  7. my($salt) = (rand()*100) =~ /^(..)/;

  8. sub new {
  9.     my $key = crypt $id, $salt;
  10.     $key =~ s/^..//;
  11.     $key .= $id++;
  12.     my $obj = bless \$key, shift;

  13.     $hash{$key} = {@_};
  14.     return $obj;
  15. }

  16. sub get {
  17.     print Dumper $hash{${+shift}};
  18. }

  19. sub DESTROY {
  20.     my $self = shift;
  21.     delete $hash{ $self};
  22.     print "$self DESTROIED\n";
  23. }

  24. 1;
复制代码
为什么代码中不能写 $$ 晕

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
5 [报告]
发表于 2011-01-25 14:45 |显示全部楼层
本帖最后由 zhlong8 于 2011-01-25 14:47 编辑
回复  zhlong8


哎,我还是觉得DESTROY不会被调用
yiten 发表于 2011-01-25 14:41



    我测试了可以调用 不过 DESTROY 那个 $hash{$$self} 才对,不知道为什么不能写两个 $$。%hash 中保存的是那个 $key 不会增加它的引用计数,$obj 没有多余的引用
  1. perl -MOO -e "OO->new() for 1..10
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
6 [报告]
发表于 2011-01-25 14:58 |显示全部楼层
本帖最后由 zhlong8 于 2011-01-25 15:05 编辑
回复  zhlong8


你这个是因为这个进程结束后因为$h的销毁而导致$h所包含的对象全部销毁的吧。
而在进 ...
yiten 发表于 2011-01-25 14:54



    那你再加个 sleep 10000 看下?你认为哪里的引用计数有问题?

    DESTROY 只要这个 blessed ref 引用为0就调用的,$obj返回的时候和任何普通的对象一样啊。$key 也只有$obj 这里一次引用,$hash{$key} 这里的 $key 是复制的不增加引用计数。实际的对象那个 hashref 也只有一个引用 $hash{$key}

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2011-01-25 15:08 |显示全部楼层
本帖最后由 zhlong8 于 2011-01-25 15:12 编辑
%hash 中保存的是那个 $key 不会增加它的引用计数?这个是真的吗?
yiten 发表于 2011-01-25 15:02



    你用 Devel::Peek 看下就知道hash有个 FLAG 是 SHAREKEYS,它像 lisp 的 symbol 一样有个内部的表保存所有的 key 保证不重复,以节省内存。所以它是复制的, 没注意过 values 返回的是 alias 而 keys 就不是?

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
8 [报告]
发表于 2011-01-25 15:24 |显示全部楼层
回复  zhlong8


晕,往hash里头放引用时我们经常用的,我也没遇到过放进去后因为没有引用计数而被析构 ...
yiten 发表于 2011-01-25 15:19



    hash 的 key 和 value 处理方式不同,key 因为不能改变,所以做了个优化。你用引用做 key? 那也是转化为字符串格式啊

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
9 [报告]
发表于 2011-09-12 15:01 |显示全部楼层
..是什么意思啊

请高手解答
rubyish 发表于 2011-09-12 10:28



    我的意思是对象的内部实现可以用一个 unique id 隐藏起来,由模块维护一个表,方法调用的时候由这个 ID 来查找真实的数据。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP