新手问题 yield 的参数与 block 参数的对应关系

yangbw4978 · 2014年09月15日 · 最后由 yangbw4978 回复于 2014年09月16日 · 2291 次阅读

class Array def fun sum = 0 self.each do |x| sum = yield(sum,x,y=4) end return sum end end

p [2,3,34,5].fun{|_sum, x| _sum = _sum+x}

输出为 44

1.在给 yield 中多传入一个参数 y=4 为什么 block 也能正常执行? 2.既然能多传入参数,那么这样做有什么用?·

搞清楚 BLOCKS, PROCS, AND LAMBDAS 三者的关系和区别就不会再有这样的疑问了。

简单的说,你传递过去的是一个 block,而 blocks 不检查传入的参数个数,所以你爱传几个参数就都行。而 lambdas 是匿名方法,它才会检查参数的个数。

正因如此,当我们有如下的代码

class Object < ActiveRecord::Base
  scope :by_app, ->(app_id) { where(application_id: app_id) }
end

当你传入的参数个数不对的时候就会报错啦。

请看下文中,BLOCKS, PROCS, AND LAMBDAS 这一段。 http://wjp2013.github.io/ruby/codecademy-ruby/

需要 登录 后方可回复, 如果你还没有账号请 注册新账号