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)变量
    
    
    
    
    
    
    
    

  • 相关阅读:
    [TroubleShooting]Neither the partner nor the witness server instance for database is availble
    VM tools安装错误The path "" is not a valid path to the xx generic kernel headers.
    博客导出工具
    puma 配置,启动脚本
    OpenCV改变像素颜色
    Android进程的生命周期
    谷歌地图换接口的新闻
    POJ 3714 Raid 近期对点题解
    CF241B Friends
    2018-2-13-wpf-使用-Dispatcher.Invoke-冻结窗口
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351130.html
Copyright © 2011-2022 走看看