Smalltalk中是否有+ =?或类似的东西?

时间:2013-07-05 22:54:50

标签: smalltalk

例如,想做像myVal += theAmount之类的东西 - 在smalltalk中有什么类似的东西吗?我找不到任何东西。

4 个答案:

答案 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 +中的老虎机可以做些什么......