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