这是我的代码:
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
。这可能是第一天的教程跟随类型问题。但是发生了什么?请注意,我知道连接运算符(,)但我仍然想知道你可以像这样添加两个字符串是什么?作为+
答案 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!