![]() |
1
374
使用
这里是
现在这是一个
由于这种令人惊讶的行为(以及较少的输入),我倾向于使用
|
![]() |
2
95
进一步澄清:
乔伊说
这就解释了为什么当涉及到arity(参数数量)时procs是灵活的,而lambda不是。块不需要提供它们的所有参数,但方法需要(除非提供了默认值)。虽然在Ruby1.8中提供lambda参数default不是一个选项,但现在Ruby1.9中支持它,并提供了可选的lambda语法(如webmat所指出的那样):
对于Ruby1.9中的procs和lambda,michiel de mare(op)的行为与arity相同,这是错误的。我已经确认他们仍然保持上述1.8的行为。
最后,
更多信息,我强烈推荐O'Reilly's Ruby编程语言 这是我大部分信息的来源。 |
![]() |
3
43
我发现
this page
这说明了两者之间的区别
irb(main):001:0> l = lambda { |x, y| x + y } => #<Proc:0x00007fc605ec0748@(irb):1> irb(main):002:0> p = Proc.new { |x, y| x + y } => #<Proc:0x00007fc605ea8698@(irb):2> irb(main):003:0> l.call "hello", "world" => "helloworld" irb(main):004:0> p.call "hello", "world" => "helloworld" irb(main):005:0> l.call "hello" ArgumentError: wrong number of arguments (1 for 2) from (irb):1 from (irb):5:in `call' from (irb):5 from :0 irb(main):006:0> p.call "hello" TypeError: can't convert nil into String from (irb):2:in `+' from (irb):2 from (irb):6:in `call' from (irb):6 from :0 页面还建议使用lambda,除非您特别需要容错行为。我同意这种看法。使用lambda似乎有点简洁,并且有如此微小的差别,在一般情况下它似乎是更好的选择。 至于Ruby1.9,抱歉,我还没有研究过1.9,但是我不认为它们会改变那么多(尽管不要相信我的话,你好像听说过一些变化,所以我可能错了)。 |
![]() |
4
15
proc比较老,但是返回的语义对我来说是非常违反直觉的(至少在我学习语言的时候),因为:
lambda在功能上更安全,也更容易解释——我总是使用它而不是proc。 |
![]() |
5
11
我不能说太多细微的差别。但是,我可以指出Ruby1.9现在允许为lambda和块使用可选参数。 下面是1.9下面的刺伤lambda的新语法:
Ruby1.8没有这种语法。声明块/lambda的常规方法也不支持可选参数:
然而,Ruby1.9支持可选参数,即使使用旧语法:
如果您想为Leopard或Linux构建ruby1.9,请查看 this article (无耻的自我提升)。 |
![]() |
6
11
简短回答:重要的是什么
不太清楚的是为什么你要使用每一个。lambda是我们所期望的,从函数式编程的意义上来说,事情应该做的。它基本上是一个匿名方法,当前范围是自动绑定的。其中,lambda可能是您应该使用的。 另一方面,proc对于实现语言本身非常有用。例如,您可以使用“if”语句或“for”循环实现它们。在proc中找到的任何返回都将从调用它的方法中返回,而不仅仅是“if”语句。这就是语言的工作方式,“if”语句的工作方式,所以我猜Ruby是在封面下使用它的,他们只是暴露了它,因为它看起来很强大。 只有在创建新的语言结构(如循环、if-else结构等)时,才真正需要这样做。 |
![]() |
7
9
一个很好的方法是在自己的范围内执行lambda(就好像它是一个方法调用),而proc可以被视为与调用方法内联执行,至少这是决定在每种情况下使用哪个proc的一个好方法。 |
![]() |
8
8
我没有注意到关于问题“proc”中第三个方法的任何评论,它被否决了,但是在1.8和1.9中处理方式不同。 下面是一个相当详细的示例,可以很容易地看到三个类似调用之间的区别:
|
![]() |
9
7
Closures in Ruby 对于块、lambda和proc如何在Ruby和Ruby中工作是一个很好的概述。 |
![]() |
10
6
Understanding Ruby Blocks, Procs and Lambdas 作者Robert Sosinski清楚地解释了这些编程概念,并用示例代码加强了解释。 方法对象 也有关联和覆盖。 |
![]() |
11
5
lambda像其他语言一样按预期工作。
有线电视
这个
你可以这么说
lambda和
顺便说一句,
|
![]() |
12
3
详细说明手风琴演奏者的反应:
注意到
(这是1.8。我不知道这是怎么翻译成1.9的。) |
![]() |
13
3
我在这方面有点晚了,但有一件很好但鲜为人知的事
这就是说,
|
![]() |
14
1
行为上的差异
|
![]() |
15
1
值得强调的是
尽管过程在
|
|
user7452246 · 我可以传递数组和块作为参数吗? 7 年前 |
![]() |
AmateurDev · Scala->Ruby转换:混乱的输出 7 年前 |
![]() |
Aso'K · 安装的操作系统版本与/proc/version不匹配 7 年前 |
![]() |
Bombozaur666 · 如何在ps-e中显示类似过程 7 年前 |
![]() |
alexanderadam · 仅当proc已设置时调用可选proc 7 年前 |
![]() |
m.h · 在ns2_new中用tcl脚本编写过程平均值 7 年前 |
|
Anaa · SAS proc IML错误:内存不足,无法存储所有矩阵 7 年前 |