最近一直在看 Web 开发,不过还真没看 PHP, 主要是觉得实在是没必要,而且为了使用 rails 而学习 php, 觉得有点得不偿失!
最近主要看的书包括
事实上,没看上面那些书之前,Agile3 以及 4 的购物车示例我已经完整的实践了一遍,但是因为很多基本概念糊涂,总是看起来不爽,总觉得别扭,现在再看 agile, 舒服多了。
我说学 Python 并不是为了真学 Python, 最近也在看`Python 核心编程', 只是我觉得对比 Ruby 来学习 Python, 例如将书本中的 Python 代码全部用 Ruby 的实现一遍,反而更可以加深对 Ruby 的印象。
好吧,我承认,连我自己现在对于闭包的准确定义也说不清是清楚还是糊涂了。
准确的来讲,上面的两个示例都没有闭包,你只不过调用了两个方法而已,方法都有自己的局部变量,这和普通方法调用又有什么区别?
def foo
x = "你好" # => 你的代码中x的含义和这里又有什么区别?
puts x
end
foo
关键是通过方法返回一个 Proc 对象,并且为这个 Proc 对象绑定一个上下文。
def foo(str)
lambda {puts str}
end
foo("你好") # => 通过这一步才形成一个闭包. 方法调用结束, str = "你好" 这个binding仍旧存在.
foo.call
至于上那段英文,我是从一个老外的帖子里摘取的。说实话,我也没太明白 return 和是否闭包有什么区别,不过如果你希望像方法那样使用一个闭包 (期望得到所需的返回值), 很显然,用 Proc.new 是有问题的。也就是说,站在调用角度考虑,闭包不应该是代码块 (yield) 的方式,而应该是方法 (call) 的方式。有关这部分,我觉得没必要细分了,就像 Matz 接受采访时说的那样,在 Ruby 中,闭包就是 lambda. OK!
应该不是的。
以上情况只是发生在使用 Chrome 浏览器 SwitchySharp 插件通过 Goagent 访问https://twitter.com/???类型网站才会出现。
汗,看到类似帖子,就心里痒痒。也许我该考虑换个地方...
@fsword A Proc.new, then, is not quite truly closed: it depends in the creating context still existing, because the "return" is tied to that context.
Not so for lambda.
甚至因为 return 的定义不同,Proc.new 都不算是真正的闭包。只有 lambda 才是闭包。
形成一个闭包的唯一办法就是:返回一个 Proc 对象,然后通过 block 设定一个上下文 binding, 并通过 call 延迟调用。我觉得这个帖子,楼主的标题绝对是有问题的。或者说,这帖子根本不是在讨论闭包...
那么按你的说法,所有 block 都是闭包,下面的语句,也算创建了一个闭包了?
def a(&block)
s = "hello, world!"
yield s
end
a {|x| puts x} # => 这个一个方法调用差不多, 和闭包八杆子打不找嘛.
我怎么感觉咱们理解的闭包的范围好像不一致,你们所形容的闭包范围是不是太广了点?通过 yield 就算形成一个闭包,你也没办法在多个调用之间传递,既然讨论闭包,怎么着也得用 call 来讨论才靠谱。我记得咱社区的@skandhas曾经说过,闭包的一大特性是被闭包的语句达到延后执行的效果,没有这个效果又怎么能叫做闭包?
虽然不想水,不过,还是顶起来吧。O_o
别沉下去,谁知道呀~
真牛~ 佩服楼主的吃螃蟹精神和研究精神!
嘿~ 看了半天我都晕了,怎么我老觉得我理解的闭包和大家说的不是一回事儿呀!在我看来,Ruby 之中的普通 yield, 因为他的实现方式 (并行赋值,并且更像代码块), 所以给我的印象是,和闭包八杆子打不找嘛。我感觉你根本不可能通过 yield 来创建一个闭包。而 lambda 因为更像方法 (匿名方法), 闭包都是通过返回一个 lambda {... }实现的。
也许我理解不对,通过 yield 也能创建闭包?也可能因为以前看过 Matz 的一篇采访实录缘故吧。我印象很深刻,当时 Matz 说,在实现 Ruby 时,闭包这个概念来自于 Lisp 当中的 lambda 运算。
不管怎么说,拿 yield 的例子来谈闭包,是不是不妥?会误导新人?
怎么有的正着穿,有的反着穿呀~ 哈!
嗨,吕国宁,你能告诉我怎么获取我之前回复过的帖子吗?NND, 昨晚上找了好久没找见,关键那个版块我都不记得。