在具有两个lambdas的函数中,当与.call一起使用时,为什么只评估最后一个lambda? (红宝石clojures)

时间:2013-05-12 03:16:01

标签: ruby-on-rails ruby lambda closures proc

在下面的代码中,我正在阅读闭包,但想知道如果函数中有多个proc对象会发生什么。所以当函数被调用时,只调用了最后一个lambda ..我在下面测试过。 (互动:http://labs.codecademy.com/BAZX#:workspace

def n_times(thing)
  lambda {|n| puts "first called"; thing * n}  
  lambda {|n| puts "second called"; thing - n}
end

test = n_times(2)
puts test.call(3)

为什么跳过第一个lambda?

puts n_times(3).call(2) => second called 1

Moreso,为什么以下无效? 编辑:删除,愚蠢的错误。谢谢以下:))

1 个答案:

答案 0 :(得分:1)

lambda是一个闭包,意味着它内部的代码在调用lambda之前不会运行。您创建了第一个lambda,但在执行lambda.call之前,块中的所有代码都不会执行。

返回最后一个lambda,因此它就是所谓的。这是执行的一个小时间线:

test = n_times(2)
puts test.call(3)
  1. n_times(2传入)
  2. 在n_times
  3. 范围内创建的lambda 1
  4. lambda 2创建了“
  5. lambda 2被隐式返回(最后一个值),存储在test
  6. test.call(5) - 第二个lambda在传入
  7. 时被调用 打印
  8. “second called”,返回-1

  9. 不再相关:

    lambda {|t| puts |t|}
    

    应该是

    lambda {|t| puts t}