zoukankan      html  css  js  c++  java
  • 闭包的潜在用处

    一个潜在的有用的是使用闭包来产生动态的子函数 基于一个模板,使用一个相对简单的例子:
    
    [root@wx03 0729]# cat a1.pl 
    sub multiply_by {
      my $multiplier = $_[0];
      return sub {
        return $_[0] * $multiplier;
      }
    }
    
    my $times2 = multiply_by(2);
    my $times10 = multiply_by(10);
    
    print &$times2(4), "
    ";
    print &$times2(6), "
    ";
    print &$times10(4) ,"
    ";
    [root@wx03 0729]# perl a1.pl 
    8
    12
    40
    
    
    采用这种方式,闭包本质上让你创建定制的subs, 冻结参数的行为 被传递这在它们的创建期间。
    
    我发现这个是有用的,如果我需要定义相关的数据 但是不是相同的行为对于应用元素到数据集,比如:
    
    
    你也可以使用闭包来强制严格的数据封装,因为它们允许你创建变量,不存在与外部世界
    
    只是一个想法,但是闭包类有一个特殊的意义在Perl 5, 而在大多数请求下 一个闭包有传统的"子函数"  运行在他定义的上下文,
    
    我也发现perlers 经常使用它 从意义上说"函数引用到一个匿名的子函数"
    
    这个可能 来自事实 闭包机制在perl是被部分破坏,
    
    在一般意义只有应用于一个匿名子函数,不是一个显示命名的函数,
    
    
    尝试这么做会导致"不共享"警告,
    
    已经有很好的例子,你可以使用闭包posted 我不会给一个例子
    [root@wx03 0729]# cat a2.pl 
    use strict;
    use warnings;
    
    sub function {
              my $i = 0;
              sub test {
                      print ++$i,"
    ";
              }
              test();
              test();
    }
    [root@wx03 0729]# perl a2.pl 
    Variable "$i" will not stay shared at a2.pl line 7.
    
    
    你可能得到一个 "variable will not stay shared" 的警告,不会得到你期望的结果。
    
    这个情况很多和  Apache::Registry 因为人们会写子函数 用全部变量和 Apache::Registry
    
    覆盖整个脚本 到一个它自己的子函数.
    
    
    闭包是很酷的 在回调模型:
    

  • 相关阅读:
    跨域处理
    intellij idea远程调试
    sring boot特性
    spring mvc与struts2的区别
    jenkins集成sonar
    hibernate笔记
    python脚本
    python 字符框
    python操作
    python环境配置
  • 原文地址:https://www.cnblogs.com/zhaoyangjian724/p/6199465.html
Copyright © 2011-2022 走看看