我知道塊可以傳遞和使用的方式。Smalltalk中的塊是否可以自行運行?
但是,有沒有辦法調用一個塊,只是有一個塊?像這樣?
aBlock := [ ... ].
aBlock run.
我試着在系統瀏覽器中搜索BlockClosure類,但是找不到它。
我知道塊可以傳遞和使用的方式。Smalltalk中的塊是否可以自行運行?
但是,有沒有辦法調用一個塊,只是有一個塊?像這樣?
aBlock := [ ... ].
aBlock run.
我試着在系統瀏覽器中搜索BlockClosure類,但是找不到它。
是結果!事實上,你可以用它們做很有趣的事情,比如在他們自己內部激活它們。例如,該塊計算階乘遞歸調用自身:
factorialBlock := [:n |
n <= 1
ifTrue: [n]
ifFalse: [n * (factorialBlock value: n - 1)]
]
,並嘗試一下:
factorialBlock value: 5
這不會是一個非常良好的編碼習慣的一個例子,但它的力量封鎖!
是的,它可以。此外,您發送消息「值」來評估該塊,而不是「運行」。實際上,您不必將其分配給變量。你可以這樣做:
[ ... ] value.
讓我們添加,除了value
,如果你的塊有爭論,你也可以使用
[:f | <do something with f>] value: a
其中f
是正式參數(未綁定變量名)和a
是實際對象,當發送#value:
時,該對象將綁定到f
。
對於兩個參數使用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)
練習
有什麼評價?:以下
block := [:x | x value: 2].
block value: [:y | y + 1]
檢查這一項:
演算在菲羅 是,在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 ] ] ]
的力在這一個強大。