例如,想做类似的事情myVal += theAmount
- 在 smalltalk 中是否有类似的东西?我什么也找不到。
4 回答
不,所有事情都发生在消息发送中,因此不可能定义一个为左侧分配新值的操作。只有带有 := 的赋值才能做到这一点。
是的,但它是常规的消息发送,而不是特殊的赋值语句。
在 Squeak 中,例如 FloatArray>>+=,它将另一个数组的元素添加到接收器的元素中:
| f |
f := #(1 2 3) asFloatArray.
f += #(4 5 6).
f
==> a FloatArray(5.0 7.0 9.0)
重要的是 f 在收到 += 消息之前和之后都指的是同一个对象。只有它的内容会改变。您可以以类似的方式为您自己的类实现 += 。
你不能做 (*) 是使用 += 替换变量的值,就像在其他语言中一样。它只是一个常规的消息发送,接收对象可能会用它做一些有用的事情。
(*) 无需破解编译器。如果你坚持,你可以做任何事情,但总的来说,这样做不是一个好主意。
从理论上讲,可能存在某种黑客行为。例如,您可以定义类NewNumber
并将其值存储在value
实例变量中。现在您可以定义
+= increment
value := value + increment
:)
甚至是一元信息
increment
value := value + 1
这将充当++。但是 Numbers 的所有魔法都是在原语的帮助下完成的(VM 端可以直接使用内存的函数。可以定义一个修改数字状态的原语,然后在 += 方法中调用它,但是老实说,添加新的原语很糟糕,并且当前的样式(您总是使用返回值)非常好。
在这里进行了冗长的讨论,表明 instVars 不像常规对象:http ://computer-programming-forum.com/3-smalltalk/6f56ed2338c3b0fa.htm
Pharo5+ 中的插槽可以解决这个问题...