我知道可以通过这种方式传递和使用块。
但是有没有办法调用块,只需要一个块?像这样的东西?
aBlock := [ ... ].
aBlock run.
我尝试在系统浏览器中搜索BlockClosure类,但无法找到它。
答案 0 :(得分:4)
是的!事实上,你可以用它们做很有趣的事情,比如在它们自己内部激活它们。例如,此块计算递归调用自身的阶乘:
factorialBlock := [:n |
n <= 1
ifTrue: [n]
ifFalse: [n * (factorialBlock value: n - 1)]
]
并试一试:
factorialBlock value: 5
这不是一个非常好的编码实践的例子,但它具有块闭包的功能!
答案 1 :(得分:3)
是的,它可以。此外,您将消息“值”发送给它以评估块,而不是“运行”。实际上,您不必将其分配给变量。你可以这样做:
[ ... ] value.
答案 2 :(得分:3)
让我们在value
之外添加,如果你的块有参数,你也可以使用
[:f | <do something with f>] value: a
其中f
是正式参数(未绑定的变量名称),而a
是实际的对象,它将绑定到{{1发送f
时。
对于两个参数,使用#value:
和许多value:value:
,其中会收到valueWithArguments:
。
<强>实施例强>
Array
<强>运动强>
评估以下内容的结果是什么?:
[:x | x squared - 1] value: 3
-> 3 squared - 1 (i.e., 8)
[:x :y | x + 2 / (y - 4)] value: 2 value: 0
-> 2 + 2 / (0 - 4) (i.e., -1)
答案 3 :(得分:1)
检查一下:
Pharo的Lambda微积分 是的,Y Combinator在普通程序中很有用
https://medium.com/concerning-pharo/lambda-calculus-in-pharo-a4a571869594#.2a78xp31s
来自文章:
ycombinator := [ :f |
[ :g | g value: g ] value: [ :g |
f value: [ :x |
(g value: g) value: x ] ] ]
这一力量很强。