在smalltalk中创建字符串会发生什么?

时间:2012-05-16 19:13:36

标签: object smalltalk

我在Smalltak中是noobie,但我需要了解我的论文的一些内容。创建字符串或任何其他对象时到底发生了什么?例如,让我们这样做:

fruit <- 'apple'

当我尝试检查对象水果时,我发现它有5个真实的变种。如果我将'梨'分配给水果,它将有4个真空。所以解释器创建了bytestring的新实例,为每个字符添加了必需的inst变量并为它们分配了适当的值?我相信还有更多事情发生,但我无法在任何地方找到它,我没有时间正确学习smalltalk。你能解释一下,或者给我一些我能找到它的链接吗?

4 个答案:

答案 0 :(得分:5)

字符串是对象。对象包含实例变量并响应消息。在Smalltalk中,基本上有两种实例变量:命名实例变量由名称引用(如Person对象中的name或phoneNumber),索引实例变量由数字引用。 String使用索引的实例变量。

考虑以下示例:

fruit := String new: 5.
fruit at: 1 put: $a;
    at: 2 put: $p;
    at: 3 put: $p;
    at: 4 put: $l;
    at: 5 put: $e.

这将创建一个包含5个字符空间的String。然后它获取fruit变量以指向该对象。然后它将5个字符写入字符串。结果是字符串&#39; apple&#39;。

由于Strings是如此常用,编译器支持在编译时创建字符串的特殊语法。

fruit := 'apple'

在这个例子中,&#39; apple&#39;是一个字符串文字。 Smalltalk编译器在编译行时创建字符串。当你运行该行时,你将使水果指向字符串&#39; apple&#39;它有5个包含Character对象的索引实例变量。

答案 1 :(得分:4)

它们不是实例变量,它们是可索引对象中的位置,非常类似于创建数组或任何其他类型集合时发生的情况。

Smalltalk中的String只是一个字符集合,其中每个字符都存储在它在String中占据的位置。

让你熟悉字符串就像数组一样的一些例子:

'Good Morning' at: 3.
#(1 'hi' $d 5.34) at: 3.

'Good Morning' fourth.
#(1 'hi' $d 5.34) fourth.

'Good Morning' reversed.
#(1 'hi' $d 5.34) reversed.

'Good Morning' select: [ :each | each ~= $d ].
#(1 'hi' $d 5.34) select: [ :each | each ~= $d ].

正如您所看到的,字符串只是另一种集合。

答案 2 :(得分:3)

字符串是可索引的对象,这意味着它们是数组而且插槽是编号而不是“标记”...

答案 3 :(得分:3)

首先,您提供的表达式不会创建字符串。 这是一个简单的任务。

fruit := 'apple'

不会创建字符串。它将现有字符串'apple'分配给fruit变量。 如果你想创建新的strins,你应该使用 (字节)字符串新: 相近 数组新:..

这是编译器在编译源代码时实际创建新字符串的方式。