加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

老xu的Perl OO培训

发布时间:2020-12-16 00:03:35 所属栏目:大数据 来源:网络整理
导读:Achilles Xu(29196159)? 17:19:50 package?Dog;?sub?new?{???my?$pkg?=?shift;???my?$name?=?shift;???return?bless?{name?=?$name},?$pkg;}?sub?shout?{???my?$self?=?shift;???print?"my?name?is?"?.?$self-{name};}1; 这个就是基本的类定义。 调用是这样

Achilles Xu(29196159)? 17:19:50

package?Dog;?

sub?new?{
???my?$pkg?=?shift;
???my?$name?=?shift;
???return?bless?{name?=>?$name},?$pkg;
}?

sub?shout?{
???my?$self?=?shift;
???print?"my?name?is?"?.?$self->{name};
}
1;



这个就是基本的类定义。

调用是这样:?my?$x?=?Dog->new;????$x->shout();

尼摩船长(909129666)??17:20:41
new是干嘛的?为什么总是每次调用的时候先要->new?


NetKey(67212915)??17:20:55
创建对象的一个实例


扬眉剑(513428834)??17:20:56
可以用其他的
你也可以用creat


Achilles?Xu(29196159)??17:21:13
new就是一个普通函数。


扬眉剑(513428834)??17:21:22
创建的意思


CGI.NET(318274085)??17:21:27
学对象的话不如先看JAVA


Achilles?Xu(29196159)??17:21:31
这里主要他的返回值特别。
return?bless?{name?=>?$name},?$pkg;
一个哈希,经过bless以后,就跟一个包绑定了。

Achilles?Xu(29196159)??17:23:13
以后通过???$x->shout?这样的调用,?就会转化成?Dog::shout($x);?这样的调用。
所以perl面向对象的本质就是使用bless,把数据(标量)跟包绑定起来。


Achilles?Xu(29196159)??17:24:14
That?is?all。
好了,可以提问了。


NetKey(67212915)??17:25:00
$pkg表示?


Achilles?Xu(29196159)??17:26:26
my?$x?=?Dog->new;???执行这句的时候,相当于调用:?Dog::new('Dog');


weiwei(332003348)??17:26:26
Dog??


Achilles?Xu(29196159)??17:26:40
这是->符号的特性。
你也可以跟__PACKAGE__绑定


狂羽(369316748)??17:27:22
::和->啥区别


扬眉剑(513428834)??17:27:24
子程序的引用,是吗?


Achilles?Xu(29196159)??17:27:27
return?bless?{},?__PACKAGE__;
箭头才会往函数参数列表前面多插东西。


尼摩船长(909129666)??17:28:13
把一个匿名散列和包绑定?


Matthew(657196500)??17:28:40
???my?$pkg?=?shift;
???my?$name?=?shift;
这里两次shift
调用的时候,都没给一个参数,怎么就shift两次


Achilles?Xu(29196159)??17:28:43
理解perl的面向对象,就是要理解bless和箭头符号。


尼摩船长(909129666)??17:29:01
那OO的其他特性呢?


Achilles?Xu(29196159)??17:29:11
这里调用的时候写漏了,应该是:?$x?=?Dog->new('Babby');


尼摩船长(909129666)??17:29:13
继承,封装什么的


weiwei(332003348)??17:29:14
第一个shift是?Dog,第一个是空
第二


Matthew(657196500)??17:29:58

这点我之前看过很多编了,印象是最深的


weiwei(332003348)??17:30:00
第一shif是包本身,是这么理解吧?


Matthew(657196500)??17:30:14
后边的就不行了


Achilles?Xu(29196159)??17:30:47
继承就是包的继承机制,也就是:?use?base?qw(Animal);?或者??@ISA?=?('Animal');


Matthew(657196500)??17:31:01
dog->new
dog::new
区别大么


Achilles?Xu(29196159)??17:31:23
@weiwei ,可以这么理解,关键是理解箭头符号补插参数的作用。

Achilles?Xu(29196159)??17:33:20
@Mat ,区别很大,前面说过了。


weiwei(332003348)??17:33:33
关键是理解箭头符号补插参数的作用。

这里是指new的参数以hash的形式bless到packege里了,是指这个吗?


Achilles?Xu(29196159)??17:34:07
不是。


Matthew(657196500)??17:34:09
经常在Perl的面向对象中看到这三种用法,有没有区别,是否可以根据喜好随意选择?
Cocoa::new()?
Cocoa->new()?
new?Cocoa


尼摩船长(909129666)??17:34:28
第三种不被建议使用


Achilles?Xu(29196159)??17:34:28
冒号那种肯定是不能替换后两者的。


Matthew(657196500)??17:35:13
第三种不被建议
第一种不能替换后两者
那么就只有第二种了


Achilles?Xu(29196159)??17:35:20
Cocoa->new()???等于??Cocoa::new('Cocoa');??????你们记好这个,还看不出区别吗?


CGI.NET(318274085)??17:35:25
Cocoa这种可以直接访问对象的方法


Matthew(657196500)??17:35:25
代码里还是比较容易看到第一种的


狂羽(369316748)??17:35:29
->能代替::吗?


CGI.NET(318274085)??17:35:40
而不用new


Achilles?Xu(29196159)??17:35:47
Cocoa->new()???等于??Cocoa::new('Cocoa');????记住这个!


Matthew(657196500)??17:35:50
Cocoa->new()???等于??Cocoa::new('Cocoa');???
这个之前学习的时候,了解到了


Achilles?Xu(29196159)??17:35:52
Cocoa->new()???等于??Cocoa::new('Cocoa');????记住这个!
Cocoa->new()???等于??Cocoa::new('Cocoa');????记住这个!
Cocoa->new()???等于??Cocoa::new('Cocoa');????记住这个!
强调一下,免得还有人问区别。


Matthew(657196500)??17:36:11
嗯,这个已经理解到了


CGI.NET(318274085)??17:36:24
这个?要看new的代码是怎么写的了


weiwei(332003348)??17:36:35
关键是理解箭头符号补插参数的作用。

那请问这个是指什么?没理解
Achilles?Xu(29196159)??17:36:35
跟new的代码无关。


Matthew(657196500)??17:37:07
new代码,一般第一行,都是
my?$self?=?shift;


Achilles?Xu(29196159)??17:37:29
@mat ,一般new第一行不会是self的。
听就虚心听。


Matthew(657196500)??17:37:48


Achilles?Xu(29196159)??17:38:01
方法的第一行才会用self
箭头左边有两种情况,一种是???Dog->new,左边是个包名,或者说是裸字符串。
另一种是?:?$x->shout(...);?左边是个变量。


Achilles?Xu(29196159)??17:39:10
左边是个变量的这种,要求变量必须是被bless过的,不然就会报错。

不管是这两种的哪种,左边的这个东西都会被作为插入到函数的第一个参数。


Achilles?Xu(29196159)??17:40:35
$x->shout(...);??等于???Dog::shout($x,?...);???记住这个!!
$x->shout(...);??等于???Dog::shout($x,?...);???记住这个!!
上面强调要记住的这两条,你们记住,然后理解,就ok了。


扬眉剑(513428834)??17:44:30
$x->shout(...)的意思是激活shout这个子程序,然后把$x作为参数传递给shout这个子程序?
对吗?


Achilles?Xu(29196159)??17:45:13
shout原来有多少程序还是照传,只是前面多插一个$x
所以在函数里经常看到用$self来接收第一个参数。其实$self和$x就是那个哈希啊。
纠正:shout原来有多少参数还是照传,只是前面多插一个$x


扬眉剑(513428834)??17:49:20
大家鼓掌感谢老许


Matthew(657196500)??17:49:26
感谢


Achilles?Xu(29196159)??17:49:43
扬眉剑,你要注意我说的那两个强调里的“等于”这两个字。


尼摩船长(909129666)??17:49:47
谢谢!!!


Matthew(657196500)??17:49:49
我已经把重要信息,摘录到EverNote中了


Achilles?Xu(29196159)??17:50:00
别搞其他神秘的,还激活什么的。
记住等于就行了,就是一个语法糖,简写法而已。


扬眉剑(513428834)??17:51:22
我貌似记住了吧


Matthew(657196500)??17:51:33
https://www.evernote.com/shard/s40/sh/86254a0e-a356-4648-94e1-619a46437113/2eb0abaf249e9cd78ea291d04f03ef84


扬眉剑(513428834)??17:51:36
我还要看书练习一下


Achilles?Xu(29196159)??17:51:51
那就等于白说了,说明还是没懂。


Matthew(657196500)??17:51:51
整理出来的内容


Wy(2283522806)??17:52:27
?你能把xu哥的qq屏蔽了吗


扬眉剑(513428834)??17:52:43
等着我整理一个通俗易懂,附带练习的


weiwei(332003348)??17:52:46
那什么叫?继承?


扬眉剑(513428834)??17:52:53
先吃饭


尼摩船长(909129666)??17:53:03
先回家吃饭先。。


Matthew(657196500)??17:53:07
这点我已经懂了
面向对象这块我看了好多次,每次都是看明白一点,过段时间总是犯迷糊
不过老xu今天讲的这点已经明白了
其他的还犯迷糊


Achilles?Xu(29196159)??17:53:23
继承就是父包的函数,子包也能调。


扬眉剑(513428834)??17:53:24
等着我的教程


尼摩船长(909129666)??17:53:31
Tie?
扬眉剑(513428834)??17:53:35
保准让大家都明白


Achilles?Xu(29196159)??17:53:39
跟tie没关系。


尼摩船长(909129666)??17:53:46


北京-Kid(664009005)??17:53:54
我插,来晚了


尼摩船长(909129666)??17:54:04
我看得晕晕乎乎的
黑豹书的那两章


Achilles?Xu(29196159)??17:54:36
可能讲的有点短,所以没有讲缘起。


AilesFX(727947255)??17:55:32
其实写写就知道了

Achilles?Xu(29196159)??17:55:51下次讲个一个小时的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读