问题描述
|
样例代码:
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)