ruby - Ruby 中的闭包

标签 ruby

示例代码:

def func(a, &closure)
  return a if a
  closure ||= lambda{ |words| puts "!!! " + words }
  closure.call("1")
  closure.call("2")
end

func(false){ |words| puts "??? " + words }   

请解释。我无法理解这一行:

closure ||= lambda{ |words| puts "!!! " + words }

如果删除 || 将永久显示如下:"!!! 1"、"!!! 2"。为什么? 并解释一下:

def func(a, &closure)

&closure 在哪里。

最佳答案

def func(a, &closure)
    return a if a
    closure ||= lambda{ |words| puts "!!! " + words }
    closure.call("1")
    closure.call("2")
end

func(false){ |words| puts "??? " + words }   

在“&closure”中,和号 (&) 表示该函数将 block 作为参数。发生的事情是您将 Proc( block 只是用不同语法定义的 Proc)传递给 func 函数,然后使用变量 1 和 2 调用该函数。

||= 表示“或等于”。如果当前值为 nil,则它用于为变量赋值。它是以下内容的简写:

closure = lamda{ |words| puts "!!! " + words } if closure.nil

This blog post很好地解释了 blocks、Procs 和 lamdas。

关于ruby - Ruby 中的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6168745/

相关文章:

ruby-on-rails - 如何获取八达通分片的数据库连接?

ruby-on-rails - Rails 使用什么 Ruby 技术让我的 Controller 方法呈现 View ?

javascript - 如何在使用 jquery 动态添加行时更改 object_id

ruby - 如何将数组中的数字乘以它在数组中的位置,然后用 ruby​​ 将数组的总和相加?

ruby-on-rails - Rails 在 list 模型中重新排列订单

Ruby:如何将从文件中读取的行拆分为二维数组?

ruby-on-rails - 必须调用 "render :layout => false"才能在 Rails 2.3.3 中正确呈现 js.erb 模板

ruby-on-rails - Rails 3.1/rake - 没有队列的特定于日期的任务

ruby - RVM 安装错误(没有校验和..无法验证它)

javascript - 如何从 RJS 模板更改 html 标签属性值?