Seb*_* N. 8 oop smalltalk visualworks squeak pharo
捕获每个Smalltalk新手的东西是add:不会返回"自我"但是添加的对象.
例如,使用此代码:
myCollection := OrderedCollection new
add: 'Peter';
add: 'John';
add: 'Paul'.
Run Code Online (Sandbox Code Playgroud)
myCollection将包含字符串"保罗",而不是集合本身.
这是因为add:返回正在添加的对象,整个级联表达式的计算结果是最后发送的消息.
相反,它应该写yourself在最后:
myCollection := OrderedCollection new
add: 'Peter';
add: 'John';
add: 'Paul';
yourself.
Run Code Online (Sandbox Code Playgroud)
add:这种行为有什么好处?小智 12
我已经考虑过这个了.我从来没有听说过Smalltalk的任何原始设计师为这个决定辩护,所以我们不确定他们为什么这么做.我之所以认为原因是因为级联.如果添加:返回接收器,那么(东西添加:thing1)add:thing2将与添加的东西相同:thing1; 添加:thing2.通过添加:返回参数,这两个表达式是不同的,程序员可以在适当的时候使用它们.
但是,我认为这是一个错误.我一直在教Smalltalk超过25年,每次教我都会遇到麻烦.我总是警告他们,但他们仍然会犯错误:所以,我认为这是一个糟糕的设计决定.
这个设计决定是关于库,而不是编译器.您可以通过进入集合类并更改它们来更改它.当然,无法预测有多少Smalltalk程序会破坏.收藏是如此根本,以至于这种改变很难成为对语言的真正改变.
在其他语言中,您可以写:
b[j] = a[i] = e;
Run Code Online (Sandbox Code Playgroud)
如果at:put:返回put对象,这将以某种方式保留在Smalltalk中 :
collectionB at: j put: (collectionA at: i put: e).
Run Code Online (Sandbox Code Playgroud)
出于同样的利益存在add:/ remove:允许这种链接的:
collectionB add: (collectionA add: anElement).
collectionB add: (collectionA remove: anElement).
Run Code Online (Sandbox Code Playgroud)