免费注册 查看新帖 |

Chinaunix

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

关于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
25 [报告]
发表于 2007-03-15 15:53 |只看该作者
何必呢,早承认错误。。。得了,呵呵

论坛徽章:
0
24 [报告]
发表于 2007-03-08 19:56 |只看该作者
呵呵。。。

我是来学习的。。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
23 [报告]
发表于 2007-03-08 19:33 |只看该作者
原帖由 knuoxy 于 2007-3-8 18:30 发表
我发觉flw说话很刻薄,可能你是无心之过。
论坛本来就是方便大家交流的。
我是凭借自己的感觉去发问的,难免有部分是表达不清,我想每个人都是这么走过来的(当然排除你在外)
但我给于你一些建议,你可以不必回答你觉的没有任何意义的帖子。

> 可能你是无心之过。
我不是无心之过,我是故意的。

> 论坛本来就是方便大家交流的。
你觉得你给别人带来了“方便”了吗?让你编辑一下你的帖子你还不改,这是“方便交流”的态度吗?

> 我是凭借自己的感觉去发问的,难免有部分是表达不清。
这里不是你的博客,也不是你的日记本。“凭感觉去发问”,而不遵守最起码的规则,就应该受到批评。
你自己说话纠缠不清,我给你指出来,你不思考我的回帖倒也罢了,居然还好意思说“难免……”,你这治学态度就非常有问题。

> 你可以不必回答你觉的没有任何意义的帖子。
这里我是版主,我有权要求你。维持这里的秩序是我的义务,看到不符合版规,我就要规劝一下,对于部分拒不执行的,我可以采取强制措施。

论坛徽章:
0
22 [报告]
发表于 2007-03-08 18:30 |只看该作者
我发觉flw说话很刻薄,可能你是无心之过。
论坛本来就是方便大家交流的。
我是凭借自己的感觉去发问的,难免有部分是表达不清,我想每个人都是这么走过来的(当然排除你在外)
但我给于你一些建议,你可以不必回答你觉的没有任何意义的帖子。但请您别
用嗤笑的语气回答问题。。

[ 本帖最后由 knuoxy 于 2007-3-8 18:32 编辑 ]

论坛徽章:
0
21 [报告]
发表于 2007-03-08 17:44 |只看该作者
引用得注意“版权”的噢

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2007-03-08 17:41 |只看该作者
原帖由 knuoxy 于 2007-3-8 16:45 发表

真不好意思。。我是直接ctrl+v的上去的。。

复制就复制吧。你最起码可以在两边加个 【】 括号嘛。再要不这样子
----------------------------------
引用部分
----------------------------------
这样都很不错啊。

原帖由 knuoxy 于 2007-3-8 16:45 发表

下次会注意

下次复下次,下次何其多。
为什么不从这次就开始呢?
BBS 有编辑功能的。

总之一句话,如果你想要别人帮你,那就尽量方便一下看帖子的人。
不然人家都看不懂你在说什么,怎么帮你?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
19 [报告]
发表于 2007-03-08 17:37 |只看该作者
原帖由 perlpg 于 2007-3-8 17:33 发表

其实有代表性的代码比文字更好解释。 ...

说的不错。以前讨论时我写过几段这样的代码,事实上文档里也有不少这样的代码。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
18 [报告]
发表于 2007-03-08 17:36 |只看该作者
> 而sub new则是静方法 也就是类方法
这里又冒出一个“静方法”,你说的是指“静态(static)”的意思吗?怎么这么多我听都没听过的术语?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2007-03-08 17:34 |只看该作者
> #因为$cup对象知道自己属于Cocoa类因此它调用的方式就如Cocoa::declareMain($cup(“Msg”,”java.appet.Applet”,”Runnable”);
对象什么都不知道。它又没有智商你怎么让它知道?
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP