| 
 
| 赞 | 0 |  
| VIP | 2 |  
| 好人卡 | 27 |  
| 积分 | 1 |  
| 经验 | 26327 |  
| 最后登录 | 2019-10-13 |  
| 在线时间 | 953 小时 |  
 Lv1.梦旅人 
	梦石0 星屑120 在线时间953 小时注册时间2007-4-25帖子805 | 
| 先抛开作用域不谈,单说词法分析问题。由于 `DestroyEvent' 这个单词的首字母是大写的,Ruby 解释器在看到它的时候会认为这是个常量,并尝试在当前命名空间中解析该常量,这个的结果自然是失败的。你需要告诉解释器这是一个方法调用,而不是一次常量的引用,就好比同名的局部变量和方法也需要显式地去区分一样。 同名的局部变量和方法也是同理。复制代码
def DestroyEvent
  "test"
end
DestroyEvent = 1
p DestroyEvent      # => 1
p DestroyEvent()    # => "test"
 再回到作用域的问题。在顶层(不在任何模块、类空间内)定义的方法最终的归属是 Object 类,这些所谓的全局方法其实是被定义为了 Object 类的实例方法,此后无论发送这个方法调用消息时的接收者是谁,都能响应消息,因为所有对象(1.9 的 BasicObject 实例除外)都是 Object 或其衍生类型。详见:
 http://szsu.wordpress.com/2009/11/07/top_level_object_kernel/
 http://rpg.blue/thread-154785-3-1.html (76 楼关于 `klass' 的部分)
 
 至于 RM 在嵌入 Ruby 时是否在这点上产生了差异我已经不记得了,目前手头暂时没有 RM 环境,只能留待你自己去测试了。
 
 
 Ruby 1.9 及之前版本并不支持一等(first-class)函数,支持一等函数是 Ruby 2.0 的一个目标。Ruby 目前支持非方法结构的闭包、lambda 演算以及方法的封装类,这些都不能算是一等函数,不过倒是可以变相实现你问题中的这个要求。
 
 使用闭包:
 使用已绑定的方法封装类实例:复制代码
$pDEFun = lambda do
  "test"
end
p $pDEFun.call # => "test"
使用未绑定的方法封装类实例:复制代码
def foo
  "test"
end
$pDEFun = method :foo
p $pDEFun.call # => "test"
复制代码
def foo
  "test"
end
$pDEFun = Object.instance_method :foo
p $pDEFun.bind(self).call # => "test"
 | 
 |