为什么添加:返回Smalltalk集合中添加的对象?

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程序会破坏.收藏是如此根本,以至于这种改变很难成为对语言的真正改变.


aka*_*ice 6

在其他语言中,您可以写:

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)