如果它已经关闭,我可以假设我可以在那里使用很多强大的功能风格的技巧吗?Smalltalk是否已关闭?
回答
是的,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 ]
Pharo有他们:
所有虚拟机有封闭性的支持需要 的最新图像
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
如果我没有记错,这使用之前的工作引入了新的闭包编译器。我不确定为什么它不适用于新的编译器。
块和方法参数在Smalltalk中是只读的。尽管如此,一些古代编译器没有正确检查块参数写入。 – 2011-06-13 08:57:47
感谢您的澄清,卢卡斯! – danlei 2011-06-15 14:25:28
但您可以使用块本地temp,如下所示: makeCounter:= [:init | | count | count:= init。 [count:= count + 1. count]]。 (makeCounter value:3)value;值 – 2016-04-04 22:38:24
- 1. pharo smalltalk窗口关闭
- 2. 如何检查zipfile是否已关闭
- 3. 检测COM端口是否已关闭
- 4. 检测Excel文件是否已关闭
- 5. .txt文件是否已关闭?
- 6. 检查浏览器是否已关闭
- 7. java.io.IOException:BufferedInputStream已关闭
- 8. www.sandbox.itunes.apple.com已关闭
- 9. 检查UIBezierPath是否关闭
- 10. 是否有可能“关闭”
- 11. fp.readlines()是否关闭文件?
- 12. WriteStream是否必须关闭?
- 13. stream.spliterator()是否关闭流?
- 14. 是否DocumentBuilder.parse关闭InputStream
- 15. 阅读器是否关闭
- 16. SqlCommand.Dispose是否关闭连接?
- 17. Zip Outputstream已关闭。 java.io.IOException:流关闭
- 18. 如何检测无模式CDialog是否已关闭?
- 19. 如何判断Android设备是否已关闭
- 20. 分支是否合并到被认为已关闭的主干?
- 21. Google Feed API无法正常工作 - 它是否已关闭?
- 22. 有没有办法确定neo4j数据库是否已关闭?
- 23. 是否“关闭飞机模式”警报已弃用?
- 24. 如何确定matplot lib轴是否已通过axes.axis('off')关闭?
- 25. 如何知道UdpClient是否已关闭/处置?
- 26. 即使ReflectionPermission已关闭,您是否可以使用反射?
- 27. 检测Outlook检查器窗口是否已关闭
- 28. 如何确定文件是否已关闭
- 29. Ruby:如何检测套接字的一侧是否已关闭
- 30. 如何检测设备浏览器是否已关闭?
您的第一个示例只接受'value:value:'消息提供的参数,但您的'whileTrue:'示例具有使用在块外部定义的变量'iterator'的块。一个是lambda,另一个是闭包,还是在Smalltalk中没有区别? – quamrana 2011-06-12 18:18:31
@quamrana:没有(可见的)区别。大多数Smalltalk实现根据外部变量的使用来优化它们的闭包对象。尽管所有关闭都能理解相同的消息,所以对于开发者来说,没有任何区别。 – 2011-06-13 08:50:08