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



我是Smalltak的菜鸟,但我需要了解一些关于我的论文的东西。创建字符串或任何其他对象时到底发生了什么?例如,让我们这样做:

fruit <- 'apple'

当我尝试检查对象水果时,我看到它有 5 个 inst var。如果我将"梨"分配给水果,它将有 4 个 inst vars。所以解释器创建了字节串的新实例,为每个字符添加了所需的 inst var 并为其分配了适当的值?我相信还有更多的事情发生,但我在任何地方都找不到它,我没有时间正确学习闲聊。你能向我解释一下,或者给我一些可以找到它的链接吗?

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

请考虑以下示例:

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 个字符空格的字符串。然后,它获取水果变量以指向该对象。然后它将 5 个字符写入字符串。结果是字符串"苹果"。

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

fruit := 'apple'

在此示例中,"apple"是字符串文本。Smalltalk 编译器在编译行时创建字符串。 当你运行这条线时,你会让水果指向字符串'apple',它有5个包含Character对象的索引实例变量。

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

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

一些示例可以让您熟悉字符串就像数组一样:

'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 ].

如您所见,字符串只是另一种集合。

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

首先,您作为示例给出的表达式不会创建字符串。这是简单的分配。

fruit := 'apple'

不创建字符串。它将现有字符串"apple"分配给水果变量。如果你想创建新的线,你应该使用(字节(字符串新:似数组新: ..

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

最新更新