• bless有两个参数:对象的引用、类的名称。
  • 类的名称是一个字符串,代表了类的类型信息,这是理解bless的关键。
  • 所谓bless就是把 类型信息 赋予 实例变量。
  • 程序包括5个文件:
    person.pm :实现了person类
    dog.pm :实现了dog类
    bless.pl : 正确的使用bless
    bless.wrong.pl : 错误的使用bless
    bless.cc : 使用C++语言实现了与bless.pl相同功能的代码


    person.pm

    CODE:
    #!/usr/bin/perl -w
    package person;
    use strict;

    sub sleep() {
           my ($self) = @_;
           my $name = $self->{"name"};

    print("$name is person, he is sleeping/n");
    }

    sub study() {
           my ($self) = @_;
           my $name = $self->{"name"};

    print("$name is person, he is studying/n");
    }
    return 1;


    dog.pm

    CODE:
    #!/usr/bin/perl -w
    package dog;
    use strict;

    sub sleep() {
           my ($self) = @_;
           my $name = $self->{"name"};

    print("$name is dog, he is sleeping/n");
    }

    sub bark() {
           my ($self) = @_;
           my $name = $self->{"name"};

    print("$name is dog, he is barking/n");
    }

    return 1;


    bless.pl

    CODE:
    #!/usr/bin/perl =w
    use strict;
    use person;
    use dog;

    sub main()
    {
           my $object = {"name" => "tom"};

    # 先把"tom"变为人
           bless($object, "person");
           $object->sleep();
           $object->study();

    # 再把"tom"变为狗
           bless($object, "dog");
           $object->sleep();
           $object->bark();

    # 最后,再把"tom"变回人
           bless($object, "person");
           $object->sleep();
           $object->study();
    }

    &main();

    # 程序运行时输出:
    # tom is person, he is sleeping
    # tom is person, he is studying
    # tom is dog, he is sleeping
    # tom is dog, he is barking
    # tom is person, he is sleeping
    # tom is person, he is studying


    bless.wrong.pl

    CODE:
    #!/usr/bin/perl =w
    use strict;
    use person;
    use dog;

    sub main()
    {
           my $object = {"name" => "tom"};

    # 没有把类型信息和$object绑定,因此无法获知$object有sleep方法
           $object->sleep();
           $object->study();
    }

    &main();

    # 程序运行输出为:
    # Can't call method "sleep" on unblessed reference at bless.wrong.pl line 10.


    使用c++实现bless的功能

    c中的代码

    CODE:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    struct object {
           char name[16];
    };

    struct person {
           char name[16];

    void sleep() { printf("%s is person, he is sleeping/n", this->name); }
           void study() { printf("%s is person, he is studying/n", this->name); }
    };

    struct dog {
           char name[16];

    void sleep() { printf("%s is dog, he is sleeping/n", this->name); }
           void bark() { printf("%s is dog, he is barking/n", this->name); }
    };

    #define bless(object, type) ((type*) object)

    int main()
    {
           struct object * o = (struct object *) malloc(sizeof(struct object));
           strcpy(o->name, "tom");

    // 先把"tom"变为人
           bless(o, person)->sleep();
           bless(o, person)->study();

    // 再把"tom"变为狗
           bless(o, dog)->sleep();
           bless(o, dog)->bark();

    // 最后,再把"tom"变回人
           bless(o, person)->sleep();
           bless(o, person)->study();
           return 0;
    }

    // 程序运行时输出:
    // tom is person, he is sleeping
    // tom is person, he is studying
    // tom is dog, he is sleeping
    // tom is dog, he is barking
    // tom is person, he is sleeping
    // tom is person, he is studying

<script type="text/javascript"></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

perl中bless的理解(zz) z相关推荐

  1. perl中bless的理解

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! bles ...

  2. 隐马尔可夫模型中的Viterbi算法zz

    隐马尔可夫模型中的Viterbi算法zz 这篇文章简单描述一下Viterbi算法--一年之前我听过它的名字,直到两周之前才花了一点时间研究了个皮毛,在这里做个简单检讨.先用一句话来简单描述一下:给出一 ...

  3. php 调用 perl,perl中如何调用R语言

    以下是从网上收集的从perl中调用R的方法: 1 直接用system()命令 比如有个test.R程序,可以通过下面的方式调用: system("R 2 安装模块RSperl 该模块的具体介 ...

  4. Perl中删除或替换字符串中特殊字符(如空格)的方法

    今天在写实验代码的时候,突然有了这样一个需求,就是用Perl将包含换行(或回车)的字符串变成一行,并且每一行用空格分隔,经过搜索,网友介绍了这样的写法: [plain] view plaincopy ...

  5. 在 Perl 中利用 DOM 和 XPath 对 XML 进行有效处理

    文在对几个大型 XML 项目进行分析的基础上研究了如何有效且高效地使用 DOM.开发人员兼作者 Tony Daruger 提供了一组用法样式和一个函数库,以使 DOM 强壮和易用.虽然 DOM 提供了 ...

  6. [译]Perl中的数组

    原文:http://perl5maven.com/perl-arrays 在本篇Perl教程中,我们将会学习Perl中的数组.本文只是对Perl中的数组进行了一下概述,在以后的文章中,我们还会更加详细 ...

  7. perl中的文件句柄

    文件句柄 文件句柄就是Perl程序里的某个名 称,代表Perl进程与外界之间的输入/输出联系.文件句柄的命名和Perl中其它变量命名没有差别(数字.下划线.字母构成,字母.下划线开头),因没 有任何的 ...

  8. 【综述】对话系统中的口语理解技术

    1. 基本介绍 对话系统中的口语理解技术一般称为NLU(natural language understanding),或SLU(spoken language understanding).NLU的 ...

  9. 谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo

    谈谈我对前端组件化中"组件"的理解,顺带写个Vue与React的demo 前言 前端已经过了单兵作战的时代了,现在一个稍微复杂一点的项目都需要几个人协同开发,一个战略级别的APP的 ...

最新文章

  1. 中文自然语言处理导论
  2. 安卓开发8-WebView支持文件上传
  3. 构建高并发高可用安全的IT系统-高并发部分
  4. function 多个函数用一个_用递归函数和栈逆序一个栈
  5. ruby koans:tdd方式学习ruby
  6. Java实现将任何编码方式的txt文件以UTF-8编码方式转存
  7. 关于GHOST恢复提示找不到GHOSTERR.TXT的文件(转)
  8. 数据聚合技术Aggregation
  9. zbbz cnk
  10. 【修真院java小课堂】什么是restful?rest的请求方法有哪些,有什么区别?
  11. STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机
  12. win10自动聚焦无法更换壁纸
  13. linux计划任务1
  14. Sea.js框架构建
  15. 《AV1 Bitstream Decoding Process Specification》,译名:AV1比特流及解码规范-Chapter 05-语法结构-Section 11~12
  16. 关于 ProgPoW:来自芯片工程师的观点
  17. 按要求编写一个Java应用程序:(1)定义一个类,描述一个矩形,包含有长、宽两种属性,和计算面积方法。(2)编写一个类,继承自矩形类,同时该类描述长方体,具有长、宽、高属性
  18. 小程序“校园易购”购物系统毕业设计
  19. Stata:dofile转PDF制作讲义方法
  20. 外虚内实是什么意思_中医讲的虚与实是什么意思

热门文章

  1. Excel 2003 VBA编程参考
  2. 推荐一个好用的OKR工具
  3. 0.96寸OLED显示屏介绍
  4. 一加7t人脸识别_一加7T深度测评:它体现了最佳的技术价值吗?
  5. 【TCP/IP学习笔记1】 C语言讲解
  6. RBF神经网络简单介绍与MATLAB实现
  7. 定时器实验循环彩灯C语言,单片机实验三-定时器实验
  8. 安装ATOM并使用apm
  9. 金融IT 行业常见术语
  10. 如何选择Python版本2还是3