3

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

fruit <- 'apple'

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

4

4 回答 4

5

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

考虑以下示例:

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 个字符的字符串。然后它获取fruit 变量以指向该对象。然后它将 5 个字符写入字符串。结果是字符串'apple'。

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

fruit := 'apple'

在这个例子中,'apple' 是一个字符串字面量。Smalltalk 编译器在编译该行时创建该字符串。当您运行该行时,您将使 fruit 指向字符串“apple”,该字符串具有 5 个包含 Character 对象的索引实例变量。

于 2012-05-17T01:28:44.370 回答
4

它们不是实例变量,它们是可索引对象中的位置,与创建 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 ].

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

于 2012-05-16T20:55:31.867 回答
3

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

于 2012-05-16T20:40:44.190 回答
2

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

fruit := 'apple'

不创建字符串。它将现有字符串'apple'分配给fruit变量。如果要创建新字符串,则应使用 (Byte)String new: 类似于 Array new: ..

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

于 2012-05-16T22:42:18.440 回答