Ruby函数lambda知识讲解

开发 开发工具
Ruby函数lambda可以帮助我们创建块。在新版本Ruby1.9中,实现了一个更新的Ruby函数lambda创建方法。希望本文介绍的内容对大家有所帮助。

Ruby语言对于一个刚刚基础编程语言不久的朋友来说,是一个非常陌生的东西。不过,它的出现可以帮助我们快速简便的完成一些功能需求。在这里,我们就为大家介绍其中Ruby函数lambda的一些用法。#t#

Ruby的Block块是它的关键特色之一,用块能够写出简明且高度可重用的算法。即使没有别的用处,它至少消弱了人们对循环敬畏的态度。这个概念在其他语言和理论中还被称为:

◆lambda函数

◆匿名函数 

◆闭包

这是个十分令人迷惑的词汇,因为闭包这个词汇还指对代码作用域的捕获。而块则不需要捕获这个作用域——例如下面的代码:

x = lambda {|x,y| x + y}

没有使用自由变量(没有绑定的变量;参数列表中正式声明x和y),因此无须创建一个闭包。

块在其他语言中有很多种多样的表现形式,有的简洁有的冗长。比如对Ruby影响深远的LISP语言,所使用的块语法为:

(lambda (arg) "hello world")

对Ruby的设计产生影响的另一种语言Smalltalk,采用方括号来简洁地表达语法: 

[arg| ^"hello world"]

Ruby中,块的最方便也最常使用的语法是作为函数的参数。它允许简单地在函数名后面添加一个用do/end 或者花括号{ / }包围的代码块。例如:

5.times {|x| puts x}

这非常的方便,同时也产生了Builder这样的习惯性用法。Builder可以通过嵌套的块来很容易地创建分层的数据结构。(提示:就在一月下旬InfoQ即将发表一篇详细描述如何在Ruby中创建Builder的文章)。

不过,还有一个问题:要传递一个以上的块给函数或方法就没那么简单了。它可以实现,但不能用这么短的语法,得使用Proc.new {} 或Ruby函数lambda来创建块。虽然还不至于恐怖,但这样会使代码冗长,而且还引入了一些不受欢迎的词汇把代码搞得凌乱不堪。(注意:Proc.new {} 和 lambda {}也有些微妙的不同,但本文不关注它们)。

在特定情况下可能有变通的方法。例如,如果一个API调用需要多个块,辅助函数就会嵌入到类中,这样就产生了两个作用:a) 辅助了块 b) 带有貌似命名参数的负作用:

find (predicate {|x,y| x < y}, predicate{|x,y| x > 20})

其中predicate函数仅仅是:

def predicate(&b) b end

它用来返回这个块。不论这是否合适或者不依赖于特定情况。在这种情况下,下面的代码——毋庸置疑地——更能表达清楚,也能起到相同的作用。

find (lambda{|x,y| x < y}, lambda {|x,y| x > 20})

为什么呢?因为lambda泄露了实现它的细节——若带有一个块参数,就不需要额外的关键词。predicate的解决方案对代码做了注解,并产生了Ruby函数lambda。需要明确的是,这只是变通的方法。

现在,Ruby 1.9引入了一个新的、更简洁的语法来创建lambda函数:

 x = ->{puts "Hello Lambda"}

新的语法更加简短,还抛弃了那个不知所云的术语lambda。需要明确的是,这是个语法糖衣。不过它的确有助于写出可读性非常好的API代码。其中一些API可以被称为“内部DSLs”,尽管它们的定义都很模糊。出于这些,新的Ruby函数lambda定义帮我们摆脱了那个夹在要么是纯领域要么是问题确定的代码中间的晦涩的术语“lambda”。

责任编辑:曹凯 来源: ddvip.com
相关推荐

2009-12-15 11:01:31

Ruby数组

2009-12-15 15:28:22

Ruby重载

2009-12-15 14:58:19

Ruby迭代器

2009-12-14 09:33:04

Ruby安装

2009-12-17 15:11:47

Ruby百分号表示法

2009-12-14 15:30:43

安装Ruby on R

2009-12-16 15:41:10

Ruby on Rai

2009-12-16 17:37:31

Ruby on Rai

2021-08-07 07:21:26

AndroidKotlinLambda

2009-12-16 13:21:22

Ruby will_p

2009-12-18 14:35:01

Ruby奇特变量

2009-12-15 09:56:51

Ruby流程控制

2009-12-15 13:26:33

Ruby单态方法

2009-12-14 14:32:50

Ruby线程局部域变量

2009-12-14 11:33:59

Ruby正则表达式

2010-05-05 13:13:55

Unix内核

2009-12-22 14:54:52

WCF安全

2009-12-18 15:24:52

2010-04-30 13:27:26

Unix cronta

2010-04-30 13:38:51

Unix at命令
点赞
收藏

51CTO技术栈公众号