Smalltalk 有一个+;=在闲聊中?或者类似的东西?

Smalltalk 有一个+;=在闲聊中?或者类似的东西?,smalltalk,Smalltalk,例如,想做一些像myVal+=theAmount-smalltalk中有类似的东西吗?我找不到任何内容。否。所有操作都与消息发送有关,因此无法定义将新值分配给左侧的操作。只有带有:=的作业才能做到这一点。理论上可能存在某种黑客行为。例如,您可以使用定义类NewNumber,并将其值存储在value实例变量中。现在您可以定义 += increment value := value + increment :) 甚至一元信息 increment value := value + 1

例如,想做一些像
myVal+=theAmount
-smalltalk中有类似的东西吗?我找不到任何内容。

否。所有操作都与消息发送有关,因此无法定义将新值分配给左侧的操作。只有带有:=的作业才能做到这一点。

理论上可能存在某种黑客行为。例如,您可以使用定义类
NewNumber
,并将其值存储在
value
实例变量中。现在您可以定义

+= increment
    value := value + increment
:)

甚至一元信息

increment
    value := value + 1

这将充当++。但是数字的所有魔力都是在原语的帮助下完成的(VM端的函数可以直接使用内存。可以定义一个原语来修改数字的状态,然后在+=方法中调用它,但是添加新的原语和当前样式(总是使用返回值)老实说很好。

是的,但这是一个常规的消息发送,而不是一个特殊的赋值语句

在Squeak中,例如FloatArray>>+=,它将另一个数组的元素添加到接收器的元素中:

| f |
f := #(1 2 3) asFloatArray.
f += #(4 5 6).
f
==> a FloatArray(5.0 7.0 9.0)
重要的是f在接收+=消息前后都引用了相同的对象。只有它的内容会改变。您可以用类似的方式为自己的类实现+=

您不能(*)使用+=替换变量的值,就像在其他语言中一样。这只是一个常规的消息发送,接收对象可能会使用它做一些有用的事情


(*)无需对编译器进行黑客攻击。如果您坚持,您可以做任何事情,但一般来说,这样做不是一个好主意。

这里的详细讨论表明InstVar与常规对象不同:


Pharo5+中的插槽可以做到这一点……

数字的一个真正好处是它们的引用是透明的。您不需要编辑数字的状态,而是通过所需的状态更改获得一个新的数字。