zoukankan      html  css  js  c++  java
  • 第四章 闭包

    闭包(Closure) 闭包是这样一种子例程,创建时,它将包含其子例程的环境打包(包括所有它需要的和不局部去本身的变量).
    
    
    子例程的引用:
    
    对有名子例程的引用:
    
    
    我们前面就已经讲过,要创建对现存变量的引用,只需要它加上反斜杠前缀。对子例程也大致如此,
    
    如&mysub就是对&mysub的引用。
    
    比如:
    
    zjzc01:/root/perl# cat t8.pl 
    sub greet {
     print "Hello 
    ";
    };
    ###没有调用greet函数
     $rs=&greet;
    print "$rs is $rs
    ";
    ##调用函数
    &$rs;
    #####调用greet函数
    $rs=&greet();
    zjzc01:/root/perl# perl t8.pl 
    $rs is CODE(0x219d308)
    Hello 
    Hello 
    
    回调函数就是通过引用来使用的普通子例程。
    
    
    闭包:
    
    不仅可以返回数据,Perl 的子例程还可以返回一个指向子例程的引用。这同其他别的传递子例程引用的方法没有什么不同,
    
    
    但是有一点是个例外,这是一种设计匿名子历程和词法变量(mysql)的隐含特性,考虑下面的例子:
    
    
    
    zjzc01:/root/perl# cat t9.pl 
    $greeting = "hello world";
    
    $rs = sub{
        print $greeting;
    };
    print "$rs is $rs
    ";
    &$rs;
    print "
    ";
    &$rs();
    print "
    ";
    
    zjzc01:/root/perl# perl t9.pl 
    $rs is CODE(0x1dbf368)
    hello world
    hello world
    
    
    zjzc01:/root/perl# cat t10.pl 
    sub generate_greeting{
      my ($greeting) = "hello world";
    
      return sub{print $greeting};
    }
    
    $rs = generate_greeting();
    
    &$rs();
    zjzc01:/root/perl# perl t10.pl 
    hello worldzjzc01:/root/perl# 
    
    
    像某个外国移民保留着自己出生地的文化和风俗习惯一样,闭包就是一些保留着在其创建时所在域中需要的变量。
    
    
    Perl 创建的闭包恰好针对(my)词法变量而不对全局或局部化(使用local)变量
    
    
    
    
    
    
    
    

  • 相关阅读:
    get_json_object 用法
    vim中的特殊字符
    vim常用命令
    mac下如何配置用户的环境变量
    vim如何替换^M ?
    git ssh 配置
    mac上pip install时提示/System/Library/... 无权限
    mysql语句--table中某列有多值时,删除其他,仅保留1条
    mysql语句如何把多行的数据合并到一行?
    微服务分布式电商项目学习笔记(二)---- 微服务架构图+微服务划分图(2020/7/1)
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351130.html
Copyright © 2011-2022 走看看