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)
ѭ5在哪里。     

解决方法

        
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 \”中,与号(&)表示该函数将块作为参数。发生的情况是您将Proc(一个块只是用不同语法定义的Proc)传递给func函数,然后该函数用变量1和2调用。 || =表示\“或等于\\”。如果当前值为nil,则用于为变量分配值。它的简写为:
closure = lamda{ |words| puts \"!!! \" + words } if closure.nil
这篇博客文章很好地解释了块,Procs和lamda。     ,        这里的标记“ 8”根本没有任何意义。它只是作为参数给出的局部块变量。当
func
与一个块一起使用时,
closure
将指代该块。如果不是,最初将是
nil
||=
的作用是,当变量为
nil
时,它分配右边的内容。因此,如果您将
func
与一个块一起使用,则
closure
将是该块;如果您不加障碍地使用它,
closure
将为
lambda{...}
。现在,如果将
||=
替换为
=
,则
closure
将始终是
lambda{...}
,无论您是否将其与块一起使用。
closure.call(1)
1
替换为
words
中的
words
,您将得到输出
!!!1
;与
closure.call(2)
类似,输出
!!!2
。     ,        这与关闭无关
closure ||= lambda{ |words| puts \"!!! \" + words }
||表示,如果初始化了变量封闭协议,则使用它,否则初始化新的lambda ambda {| words |放置\“ !!! \” +单词} 因为您已经通过了lambda
func(false){ |words| puts \"??? \" + words } 
未初始化的默认lambda(具有!!!) 但是,如果删除||,它将始终初始化新的lambda 您可以打印!不删除||,只需调用
   func(false)
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...