免费注册 查看新帖 |

Chinaunix

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

关于 constructor 的 ref($classname) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-22 17:24 |只看该作者 |倒序浏览
在constructor 里面
my $class = ref($proto) || $proto;

用这个ref 的作用是什么呢
到今天才明白
clone 是吧????

论坛徽章:
0
2 [报告]
发表于 2012-03-22 17:35 |只看该作者
ref EXPR
       ref Returns a non-empty string if EXPR is a reference, the empty string otherwise. If EXPR is not specified, $_ will be used.  The value returned depends on the type of
           thing the reference is a reference to.  Builtin types include:

               SCALAR
               ARRAY
               HASH
               CODE
               REF
               GLOB
               LVALUE
               FORMAT
               IO
               VSTRING
               Regexp

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2012-03-22 17:35 |只看该作者
ref 就是 typeof

论坛徽章:
0
4 [报告]
发表于 2012-03-22 18:25 |只看该作者
回复 3# flw


    ......
首先ref(reference)
这个reference是某个class 的 instance 他不是返回classname 吗
我的意思是
sub new {
    my $proto = shift;
    my $class = ref($proto) || $proto;
    my $self = { @_ };         
    bless($self, $class);
    return $self;
}



在这个constructor里面 为什么要处理  ref($proto) 这个情况?

我的理解是只有当这个class 的一个method 需要clone 自己的时候 才会出现

sub clone {
   my $self = shift;
   my $clone = $self->new(clone=>1,@_);
   return $clone;
}

对不???????

论坛徽章:
0
5 [报告]
发表于 2012-03-22 23:44 |只看该作者
my $clone = $slef->new(%$slef,clone=>1)

论坛徽章:
0
6 [报告]
发表于 2012-03-23 09:42 |只看该作者
Intermediate Perl里面有详细介绍,cu里有翻译的1-12章
12.6.让一个方法在类和实例都可以使用
解决这个问题, 我们所要做的就是查这个方法的调用者是个类还是实例。最直
接的方法是用ref 操作符。这个操作符在用在一个blessed引用上会返回一个
字串(类名), 而用在一个字串(如类名)时返回的是空值。我们改下看看:
  1. subname{
  2. my$either=shift;
  3. ref$either
  4. ?$either #it'saninstance,returnname
  5. :"anunnamed$either"; #it'saclass,returngeneric
  6. }
复制代码
这里?: 操作符选择是否是还原或是类字串。现在不管是实例或者是类我们
都可以使用他们。注意, 我们把第一个参数位改成$either来显示这是有意的:
  1. printHorse->name,"\n"; #prints"anunnamedHorse\n"
  2. my$tv_horse=Horse->named('Mr.Ed');
  3. print$tv_horse->name,"\n"; #prints"Mr.Ed.\n"
复制代码
我们将使用这个设置叫声:
  1. subspeak{
  2. my$either=shift;
  3. print$either->name,'goes',$either->sound,"\n";
  4. }
复制代码
因此sound 方法既可以在类上也可以在实例上运行, 完成了!

论坛徽章:
0
7 [报告]
发表于 2012-03-23 10:21 |只看该作者
回复 6# wuqi198772

没看。。。 没看不过貌似我买了那本书了~~~~

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP