zoukankan      html  css  js  c++  java
  • 关于perl闭包(个人理解)

    我个人理解,就是当一个变量超出作用域时,应是消失了,不见了的,但你还能访问它,这就是闭包。


    #看下面的例子。

    #!/usr/bin/env perl -w
    use strict;
    {
            my $value = 'abc';
    }
    print $value;

    如果如下:

    因为{}超出后,$value不存在了,所以print变成打印一个未定义的变量,会出错。

    再来看一个例子:

     1 #!/usr/bin/env perl -w
     2 use strict;
     3 sub function_1{
     4         my $value = 'abc';
     5         my $in_function_1 = sub{print "$value
    ";};
     6         return $in_function_1
     7 }
     8  
     9 my $value = function_1;
    10 $value->();

    结果如下:

    #
    可以看到,这个$value应是不存在了的,但还能访问他,这种情况就称为”闭包”。


    可能你会想说,这个不就是return返回给他了吗,因为第一个例子并不返回$value, 所以不能打印?!

    个人看法:
    对于第一个例子,如果你直接返回$value的话,他的值是返回了,但这个值虽相同,即不是同一个变量了。
    而对于第二个例子,他访问的$value从头到尾都是它自身。(但内部,可能会自动创建变量的副本)


    这里引用一句 “perl语言编程的” 的话:
    表示某个特定时刻在一个特定的词法作用域中定义一个匿名函数时,它会假装在这个作用域中运行,
    尽管之后可能在这个作用域之外调用(但它不是假装,它确实会在那个作用域中运行),就称为“闭包“。


    个人建议按常规函数去理解就行,别 “太” 在意”闭包“ 这两个字。

  • 相关阅读:
    P1865 A % B Problem
    P1198 [JSOI2008]最大数
    从英语学习写起,收获2013属于我的金秋
    Hadoop--有关Hadoop的启动
    android中文字高亮设置案例
    <Win32_16>来看看标准菜单和右键菜单的玩法
    jQuery 自学笔记—3
    【译】如何精确判断最终用户响应时间过长的原因?
    网络爬虫返回json处理数据
    2013--转变
  • 原文地址:https://www.cnblogs.com/perl6/p/6120050.html
Copyright © 2011-2022 走看看