为什么22转换为字符串时,使用printOn或StoreOn,仍然像整数一样添加?

时间:2011-11-10 21:27:13

标签: smalltalk squeak

这是我的代码:

x := 22 storeString.
y := x + x.
Transcript show: y.

预期产量:2222 实际产量:44。

我认为发送到22的storeString消息分配给x,会导致字符串值存储到x中。

所以我想,我在smalltalk中很新。也许这是运营的顺序?所以我尝试了这个:

x := (22 storeString).
y := x + x.
Transcript show: y.

相同的结果,如果我使用printOn而不是storeOn。这可能是第一天的教程跟随类型问题。但是发生了什么?请注意,我知道连接运算符(,)但我仍然想知道你可以像这样添加两个字符串是什么?作为+

的一部分,是否会发生从字符串返回到整数的隐式转换

3 个答案:

答案 0 :(得分:4)

Smalltalk中只隐含了一些内容。您可以在String类中浏览#+选择器的实现,并自己查找正在发生的事情。或者打印String >> #+ definition。 您还可以查看任何正在运行的对象实例的内部,以便您可以评估x inspect,以找出x确实是一个字符串。

答案 1 :(得分:3)

#+已在String上实施,并在执行添加之前对Number进行强制。

Squeak在其核心代码库中传播了许多eToys(针对孩子的Smalltalk变体)代码。这可能是String实现所有数学运算符的原因。在Pharo中,数学运算符大多已从String中删除,因此'1' + '2'会像其他任何Smalltalk一样引发错误。

答案 2 :(得分:3)

打开工作区。输入:

' 12' +' 34'

突出显示然后使用右键菜单调用"调试它"。如果有一个"杀手级应用程序"对于Smalltlak来说,这是Smalltalk调试器始终与"所有对象进行交互的方式" Smalltalk的本质。你可以看到一切是什么以及它是如何做的。如果您使用"进入",您将能够确切地看到它如何将其转变为' 46'

更酷(我认为),就是你可以做到

12 +' 34'

(第一个不再是字符串,而是直接数字)。同样,您可以使用调试器,并且Smalltalk用于进行超越数学运算的整个双重调度机制将向您开放。

你甚至可以做像

这样的奇怪例子

4.0 +#(' 13' 2)

(这里我们在数组中添加一个数字,数组内容是混合类型的)

快乐的Smalltalking!