大家对这个程序怎么看?谁能帮忙用 ruby、python 实现一下,看看结果?

饿。。。只能说大致理解了意思
内部传递时,中间“空”传递了一次
竟然就没被识别为'A',成为未初始化的。。默认成为0
而且编译也就顺利通过了,真诡异,实际上说来,f的调用并没有对外层的$x产生影响,也就失去了闭包的价值?
虽然说,外层有$x的申明,内层才能使用$x,但是。。。却能自己记录自己的1,2,3
那是不是说f->()里面的$x被识别为f{}里面的$x了,所以g不可见,所以,f和g分别有自己的$x
感觉还是不太懂啊


QUOTE:
原帖由 perljoker 于 2007-9-21 14:39 发表
却能自己记录自己的1,2,3 ...

关键在于初始化。closure在第一次调用以后,就会保留上下文的一个复制,所以纪录自己的1,2,3是正常的。
刚找到perlbug上类似的讨论:
http://rt.perl.org/rt3/Public/Bug/Display.html?id=7519
This bug has been fixed in the latest development version
of Perl (which will eventually be released as 5.10.0).

----------------------------------------

谁有 5.10.0?


QUOTE:
原帖由 cobrawgl 于 2007-9-20 15:30 发表
use strict;
use warnings;

{
  my $x = 'A';
  sub f { sub { $x++ }       }
  sub g { sub { $x++ } if $x }
}
my $F=f();
my $G=g();
print $F->(),$G->(),"," f ...

楼主提了一个好问题,最近学了一点PYTHON,碰到的问题与楼主类似,大家讨论下:

1、第一个版本,在closure中绑定global变量

[Copy to clipboard] [ - ]
CODE:
outter = 1
def make_function():
        def inner():
                global outter # 见注1
                outter = outter + 1
                return outter
        return inner

f = make_function()
print(f())
print(f())
print(f())

输出结果:
2
3
4

注1:在Python语言中,变量的可视性缺省为局部,如果要引用全局变量的话,需要使用global申明。

2、第二个版本,在closure中绑定local变量

[Copy to clipboard] [ - ]
CODE:
def make_function():
        outter = 1
        def inner():
                outter = outter + 1
                return outter
        return inner

f = make_function()
print(f())
print(f())
print(f())

结果编译出错!

[Copy to clipboard] [ - ]
CODE:
UnboundLocalError: local variable 'outter' referenced before assignment

3、第三个版本,使用royalzhang网友的“提及变量”的方法
发现这个方法在Python中不管用,编译会报错。

4、有人认为这也算python的一个bug,据说在py3000中,内部函数可以绑定外部函数的局部变量,但是我对那个东东就没有研究了。

PS:小弟我感觉perl对于我来说过于复杂了,已经追随limdou走的道路转投python阵营了,作为Python初学者,在资深perler们面前献一回丑,呵呵!



QUOTE:
原帖由 DennisRitchie 于 2007-9-21 16:46 发表

小弟我感觉perl对于我来说过于复杂了,已经追随limdou走的道路转投python阵营了,作为Python初学者,在资深perler们面前献一回丑,呵呵!

不好意思,看不出你这贴有什么意义


QUOTE:
原帖由 cobrawgl 于 2007-9-21 17:41 发表


不好意思,看不出你这贴有什么意义

15楼的帖子讨论了python语言中closure的变量绑定问题,你不是想“知道类似的程序在 ruby和 python 里是什么输出”?

PS:你何必这么小气了?不就是说了你们几句吗?哎。。。你看看flw的最新的签名档吧