请教一个问题,`Method 对象' 到底是不是 Closure 的?
method capture 绑定了实例变量的环境,method 对象可以看作某种形式上的 closure
method 也可以用 lambda 定义
x = 0
@x = 0
define_singleton_method(:f) { x += 1; @x += 1 }
f
x #=> 1
@x #=> 1
这里的 method(:f)
在 局部变量/实例变量 两种环境上都是 closure 了
多谢吕哥~!!
我自己测试也是 closure 的,可是 `Ruby 程序语言' 中说不是 closure 的。一直耿耿于怀....
看样子是翻译错误,或者是当时 Ruby 1.9 的特性还未完全确定,后来更改了。
嗯,可能是上下文问题。虽然你的示例代码我也肯定不会把它当作方法对象
来考虑呀。
Ruby编程语言
, 204 页 (6.7), 在讲 闭包
, 原文如下:(中文版)
Method 对象和 Proc 对象一个重要区别是 Method 对象不是闭包。
这里翻译貌似不准确吧。害我好久...
虽然后面还有一句:
Ruby 的方法是完全自包含的
你怎么和我之前想法一样呢?所谓的 Closure 有个广义和狭义的含义。以前讨论过的。我们的理解都是没错的。
#6 楼 @zw963 CallByThunk 只是和 Closure 在很多时候有类似的效果而已
http://c2.com/cgi/wiki?CallByThunk
我倒是认为还是用最准确的那个比较好。而不是单纯用这种实现的意图来当名字。
不然class is poor man's closure
,class
也叫closure
了?
每太看明白.... 貌似就是多了一个栈 DFP 喽?
不知道哪里有那些 C 内部的命名约定的介绍?
事实上,Ruby 在报错时,经常会抛出类似的信息,可是没有好的文档,只能猜。
例如:ivptr, 猜得出来是 instance_variable pointer, 但很多不见得可以猜出来。