• 第四章 闭包


    闭包(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)变量
    
    
    
    
    
    
    
    

  • 相关阅读:
    集成学习值Adaboost算法原理和代码小结(转载)
    集成学习原理小结(转载)
    2019阿里校招测评题,光明小学完全图最短路径问题(python实现)
    第八节、图片分割之GrabCut算法、分水岭算法
    Scala2.11.8 spark2.3.1 mongodb connector 2.3.0
    spark 实现动态日期读取
    Idea 201601注册码
    linux下的crontab服务
    spark MySQL jar 包
    scala 日期格式转换
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351130.html
Copyright © 2020-2023  润新知