Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148079
  • 博文数量: 56
  • 博客积分: 245
  • 博客等级: 二等列兵
  • 技术积分: 520
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-08 14:43
个人简介

慢慢来

文章分类

全部博文(56)

文章存档

2017年(5)

2016年(2)

2015年(6)

2014年(28)

2013年(5)

2012年(10)

我的朋友

分类: Python/Ruby

2012-11-06 17:29:25

程序包括5个文件
person.pm :实现了person类 
dog.pm :实现了dog类 
bless.pl : 正确的使用bless
bless.wrong.pl : 错误的使用bless
bless.cc : 使用C++语言实现了与bless.pl相同功能的代码


person.pm

点击(此处)折叠或打开

  1. #!/usr/bin/perl -w
  2. package person;
  3. use strict;
  4. sub sleep() {
  5.         my ($self) = @_;
  6.         my $name = $self->{"name"};
  7.         print("$name is person, he is sleeping\n");
  8. }
  9. sub study() {
  10.         my ($self) = @_;
  11.         my $name = $self->{"name"};
  12.         print("$name is person, he is studying\n");
  13. }
  14. return 1;


dog.pm

点击(此处)折叠或打开

  1. #!/usr/bin/perl -w
  2. package dog;
  3. use strict;
  4. sub sleep() {
  5.         my ($self) = @_;
  6.         my $name = $self->{"name"};
  7.         print("$name is dog, he is sleeping\n");
  8. }
  9. sub bark() {
  10.         my ($self) = @_;
  11.         my $name = $self->{"name"};
  12.         print("$name is dog, he is barking\n");
  13. }
  14. return 1;


bless.pl

点击(此处)折叠或打开

  1. #!/usr/bin/perl -w
  2. use strict;
  3. use person;
  4. use dog;
  5. sub main()
  6. {
  7.         my $object = {"name" => "tom"};
  8.         # 先把"tom"变为人
  9.         bless($object, "person");
  10.         $object->sleep();
  11.         $object->study();
  12.         # 再把"tom"变为狗
  13.         bless($object, "dog");
  14.         $object->sleep();
  15.         $object->bark();
  16.         # 最后,再把"tom"变回人
  17.         bless($object, "person");
  18.         $object->sleep();
  19.         $object->study();
  20. }


使用c++实现bless的功能

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. struct object {
  5.         char name[16];
  6. };
  7. struct person {
  8.         char name[16];
  9.         void sleep() { printf("%s is person, he is sleeping\n", this->name); }
  10.         void study() { printf("%s is person, he is studying\n", this->name); }
  11. };
  12. struct dog {
  13.         char name[16];
  14.         void sleep() { printf("%s is dog, he is sleeping\n", this->name); }
  15.         void bark() { printf("%s is dog, he is barking\n", this->name); }
  16. };
  17. #define bless(object, type) ((type*) object)
  18. int main()
  19. {
  20.         struct object * o = (struct object *) malloc(sizeof(struct object));
  21.         strcpy(o->name, "tom");
  22.         // 先把"tom"变为人
  23.         bless(o, person)->sleep();
  24.         bless(o, person)->study();
  25.         // 再把"tom"变为狗
  26.         bless(o, dog)->sleep();
  27.         bless(o, dog)->bark();
  28.         // 最后,再把"tom"变回人
  29.         bless(o, person)->sleep();
  30.         bless(o, person)->study();
  31.         return 0;
  32. }


bless.wrong.pl

点击(此处)折叠或打开

  1. #!/usr/bin/perl =w
  2. use strict;
  3. use person;
  4. use dog;

  5. sub main()
  6. {
  7.         my $object = {"name" => "tom"};
  8.         # 没有把类型信息和$object绑定,因此无法获知$object有sleep方法
  9.         $object->sleep();
  10.         $object->study();
  11. }

程序运行输出为:
Can't call method "sleep" on unbles
sed reference at bless.wrong.pl line 10.
阅读(3703) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

perl6ide2017-06-08 12:11:48

一个小例子讲透bless用法。

首先定义参数:
my $object = {\"name\" => \"tom\"};
这里$object是个匿名hash的引用,这样就能传参数进入person和dog类(包/函数)里了。

然后这里:
my ($self) = @_;
my $name = $self->{\"name\"};
直接解引用按key读value作为参数。

bless是把一个对象和一个类(一个参数和一个函数/包)绑定。
绑定后就可以直接调用了。

http://blog.chinaunix.net/uid-28246152-id-3399154.html

perl的函数接受参数时,@_数组是扁平的一维数组,
任何其它类型的原始数据结构都不能原样传进来,于是就只好传引用了。
传引用,解引用。

get新技能:
1、传参。
2、bless做对象和类(参数和函数)的绑定。