例如,使用逻辑运算符进行评估:
(object1 = object2) & (object3 = object4)
:这将评估整个表达式,即使左侧部分为假,其余部分也将进行评估。(object1 = object2) and: [object3 = object4]
:这将评估左侧部分,只有在第一部分为真的情况下才会评估正确的部分。答案 0 :(得分:10)
一切都是对象,虚拟机上方的所有东西都可用于检查和修改。 (至少在概念上,基元是虚拟机的一部分。)即使你的调用堆栈可用(thisContext
) - Seaside通过简单地将调用堆栈调入流中并恢复它来恢复它(返回到当天)简单地从该流中读出激活帧!
您可以从字符串构建选择器并将其转换为Symbol
并将其作为消息发送:self perform: 'this', 'That'
将执行与self thisThat
相同的操作。 (但是不要这样做,出于同样的原因,你应该避免在Lisps和PHP中使用eval
:很难调试!)
消息传递:它是not method invocation!
#become:
对于之前没见过的人来说可能有些震撼。 (tl; dr批量交换两个对象指针 - 所有对B的引用现在都指向A,所有对A的引用现在都指向B)
答案 1 :(得分:4)
Primitves
someMethod
<primitive 14122 wtf>
"fail and execute the following"
[self] inlineCopyInject: [:t1 | self].
答案 2 :(得分:4)
我与Smalltalk的第一次摔跤会议是元类实现。
考虑一下:
'This is a string'
的班级是什么?好吧,像String
。
String
的班级是什么? String class
。注意:这是一个类,但它没有名称,它只是将自己打印为'String class'。
String class
的班级是什么? Metaclass
。注意:这是一个命名类。
Metaclass
的班级是什么?正如您所料(或不是),这是Metaclass class
。其中,如您所料,该课程再次为Metaclass
。
这是第一个循环。另一个我最初发现相当深奥的(当然,现在我早餐吃的是元餐)是下一个:
String
的超类是什么? Object
(最终,Smalltalk的不同实现具有这些基本类的不同类层次结构)。
Object
的超类是什么? nil
。现在这是Smalltalk中一个有趣的答案,因为它实际上是一个对象! nil class
回答UndefinedObject
。其中超类是...... Object
。
在那些日子里,通过超级阶段和关系实例导航对我来说是一个真正的过山车...
答案 3 :(得分:4)
选择性断点(我实际上有时使用它)怎么样:
foo
thisContext sender selector == #bar ifTrue:[ self halt ].
...
将自行调试,但仅限于从bar调用。有用的,如果从其他地方召唤foo并且经常会遇到常规断点。
答案 4 :(得分:3)
我一直都喜欢Smalltalk quine:
quine
^thisContext method getSource
(Pharo版本。)