免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
41 [报告]
发表于 2011-01-24 17:29 |只看该作者
回复  yiten


确实有问题。这样会好些吧。
greencow 发表于 2011-01-24 16:42



这个挺巧,和用hash做全局变量的道理一样。
但是有个问题,在类代码里,必须有个约定,必须使用$this-1来取得自己相关的值,否则,你写个$h->[1],那么就把某个实例给插了。

但是还有一个更严重的问题,这样实例引用得不到释放。oo了100个实例,这些实例会一直被$h所引用,直到进程结束才释放

论坛徽章:
0
42 [报告]
发表于 2011-01-24 22:42 |只看该作者
回复 44# yiten


    第一个问题:bless的时候可以先减一。第二个问题:析构函数里delete数组成员,但要小心array size可能会变化。

    Perl 是很棒的工具和玩具,但如果不小心也很容易杯具。Java很严格和严肃,就不会这样。

    刚看了一些golang,也是一个很好的玩具,但难以判断其未来。

论坛徽章:
0
43 [报告]
发表于 2011-01-25 10:16 |只看该作者
回复 45# greencow


减1加1都没法解决,如果代码里写个$h->[1]=4,那么你在oo第2个实例的时候,就把前面的存储在下标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
44 [报告]
发表于 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;
复制代码
为什么代码中不能写 $$ 晕

论坛徽章:
0
45 [报告]
发表于 2011-01-25 14:41 |只看该作者
回复 47# zhlong8


哎,我还是觉得DESTROY不会被调用

论坛徽章:
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
46 [报告]
发表于 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
复制代码

论坛徽章:
0
47 [报告]
发表于 2011-01-25 14:54 |只看该作者
回复 49# zhlong8


你这个是因为这个进程结束后因为$h的销毁而导致$h所包含的对象全部销毁的吧。
而在进程结束之前,所有的实例都因为被引用在$h里而不会被析构,就是说所有的实例生命周期将和$h一样长

论坛徽章:
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
48 [报告]
发表于 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}

论坛徽章:
0
49 [报告]
发表于 2011-01-25 15:02 |只看该作者
%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
50 [报告]
发表于 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 就不是?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP