如果它有闭包,我可以假设我可以在那里使用许多强大的功能样式技术吗?
答案 0 :(得分:7)
是的,Smalltalk已关闭。以下代码创建一个闭包,返回其两个参数的总和:
sum := [ :a :b | a + b ].
闭包是可以实例化,传递和操作的对象。要评估关闭,请发送value
,value:
,value:value:
,...
sum value: 1 value: 2.
闭包突出地与集合一起使用来迭代,过滤,映射......集合的所有值:
aCollection select: [ :each | each isOdd ].
aCollection inject: 0 into: [ :each :result | each + result ].
此外,它们用于控制结构,如循环:
[ iterator hasNext ]
whileTrue: [ iterator next ].
1 to: 10 do: [ :each | ... ].
使用闭包实现条件:
condition
ifTrue: [ do this ]
ifFalse: [ do that ]
答案 1 :(得分:5)
Pharo有他们:
所有VM都需要关闭支持 最新图片
makeAdder := [ :x | [ :y | x + y ]].
add2 := makeAdder value: 2.
add2 value: 3.
返回5
。
但请注意
makeCounter := [ :init | [ init := init + 1. init ]].
不起作用(Cannot store into ->init …
),例如CL:
CL-USER> ((lambda (init) (lambda () (incf init))) 0)
#<COMPILED-LEXICAL-CLOSURE #xC7A495E>
CL-USER> (funcall *)
1
CL-USER> (funcall **)
2
CL-USER> (funcall ***)
3
如果我没有弄错,那么在引入新的闭包编译器之前,这常常会起作用。我不确定为什么它不适用于新的编译器。