论坛首页 Ruby版

语言第二类特性之闭包

浏览 683 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-06-29 关键字: think
所谓语言第二类特性是排除掉基本语言特性(第一类:语句,表达式,类型)和类库或API特性(第三类:数据库,文本,正则表达式等)的所有其他语言特性,这种类型的特性,一般包含一些很值得研究的思想或Idea。

大家一起来研究指正

【闭包】
定义
(Martin Fowler)
闭包的第一个关键点是闭包是一段代码加上和定义它的环境之间的绑定(they are a block of code plus the bindings to the environment they came from)。这是闭包和函数指针等其它相似技术的不同点。

第二个不同点不是定义形式的不同,但是也同样重要。(The second difference is less of a defined formal difference, but is just as important, if not more so in practice)。

类别
:函数
绑定:晚绑定
支持语言:几乎全部
理解
首先是匿名函数,其次是运行期间有独立的上下文,这个上下文与定义它的环境隐式绑定,第三三,书写方式不同。
语义:一类计算,它不仅根据显式参数求值,同时针对域的相关上下文求值。
可靠性:危险
何时使用:A:如果未隐式绑定上下文,则当匿名函数使用;
B:如果绑定上下文,当“自适应”函数使用,即函数适应不同的实例进行计算求值。但是要将其所适应的上下文明确,个人建议对应的变量命名应该是:函数名+By+上下文名+常量名。
如果把值作为名称的一部分,会遇到当引用的具体常量值发生变化时,会遇到需要重构的情况。所以应该定义出一个常量,比如“工资大于1200”,1200这个值一般来说有个意义。
C:持续求值??:当应用域变量会根据域的上下文变化时,将变量定义为闭包的引用可以实现每次使用该变量时重新根据上下文进行计算。
   
最后更新时间:2008-06-30
helloworld 写道
个人建议对应的变量命名应该是:函数名+By+上下文名+常量名

读到这儿,有点眩晕~
   
0 请登录后投票
最后更新时间:2008-07-01
我的意思是闭包由于引用了上下文中的局部变量,这样对于调用者来说采用一个清晰的命名可以避免犯错。
为什么有常量名:
比如闭包的功能为判断薪水的值是否大于某个数,那么首先这个数就应该明确定义常量名,因为在实际应用中这个数肯定会有意义。
   
0 请登录后投票
最后更新时间:2008-07-01
helloworld 写道
我的意思是闭包由于引用了上下文中的局部变量,这样对于调用者来说采用一个清晰的命名可以避免犯错。
为什么有常量名:
比如闭包的功能为判断薪水的值是否大于某个数,那么首先这个数就应该明确定义常量名,因为在实际应用中这个数肯定会有意义。


避免直接常量是编码原则,与是否在闭包中无关。
闭包中引用上下文中的局部变量,我看过的ruby代码,都没有搞特殊形式。

能不能拿实际代码出来,讲它的必要性。
   
0 请登录后投票
最后更新时间:2008-07-04
有篇老贴值得一读
http://www.javaeye.com/topic/34335
   
0 请登录后投票
最后更新时间:2008-07-22
类似硬件设计的一个Block,求值始终和环境有关(持续求值)
   
0 请登录后投票
最后更新时间:2008-07-23
其它语言不清楚,就ruby而言,闭包的环境绑定在闭包代码产生的位置就发生, 并且不会改变(除非用eval来hack), 因此在函数名中体现上下文似乎就没有必要了:

  a = 33
  block = lambda { a }
  def redefine_a(b)
    a = 44
    b.call
  end
  redefine_a(block)      # => 33
   
0 请登录后投票
论坛首页 Ruby版

跳转论坛:
JavaEye推荐