Ruby 请教一个问题, `Method 对象' 到底是不是 Closure 的?

zw963 · 2012年12月05日 · 最后由 Daniel_Xu 回复于 2013年02月21日 · 3094 次阅读

请教一个问题,`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 了

#1 楼 @luikore

多谢吕哥~!!

我自己测试也是 closure 的,可是 `Ruby 程序语言' 中说不是 closure 的。一直耿耿于怀....

看样子是翻译错误,或者是当时 Ruby 1.9 的特性还未完全确定,后来更改了。

#2 楼 @zw963 是不是要看上下文讲的是什么了...

x = 0
def f
  x += 1
end

这种 method 对象相对局部环境就不是 closure

#3 楼 @luikore

嗯,可能是上下文问题。虽然你的示例代码我也肯定不会把它当作方法对象来考虑呀。

Ruby编程语言, 204 页 (6.7), 在讲 闭包 , 原文如下:(中文版)

Method 对象和 Proc 对象一个重要区别是 Method 对象不是闭包。

这里翻译貌似不准确吧。害我好久...

虽然后面还有一句:

Ruby 的方法是完全自包含的

#4 楼 @zw963 Proc 也不是 Closure 吧,lambda 才是 Closure 吧...

#5 楼 @bhuztez

你怎么和我之前想法一样呢?所谓的 Closure 有个广义和狭义的含义。以前讨论过的。我们的理解都是没错的。

http://ruby-china.org/topics/3108

#6 楼 @zw963 CallByThunk 只是和 Closure 在很多时候有类似的效果而已

http://c2.com/cgi/wiki?CallByThunk

我倒是认为还是用最准确的那个比较好。而不是单纯用这种实现的意图来当名字。

不然class is poor man's closureclass也叫closure了?

#7 楼 @bhuztez

这只是 什么时候可以形成了一个闭包?这真正是一个闭包 的问题。

#8 楼 @zw963 那你这个问题就没法问了

#9 楼 @bhuztez

我问的其实是第一个。

据说 ruby 中的闭包有三个部分组成

#11 楼 @googya

每太看明白.... 貌似就是多了一个栈 DFP 喽?

不知道哪里有那些 C 内部的命名约定的介绍?

事实上,Ruby 在报错时,经常会抛出类似的信息,可是没有好的文档,只能猜。

例如:ivptr, 猜得出来是 instance_variable pointer, 但很多不见得可以猜出来。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号