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

Object 在smalltalk中创建字符串时会发生什么?,object,smalltalk,Object,Smalltalk,我在Smalltak没什么事,但我需要为我的论文理解一些东西。创建字符串或任何其他对象时到底发生了什么?例如,让我们这样做: fruit <- 'apple' fruit字符串是可索引对象,这意味着它们是数组,插槽编号而不是“标记” 它们不是实例变量,而是可索引对象中的位置,与创建数组或任何其他类型的集合时发生的情况非常相似 在Smalltalk中,字符串只是字符的集合,每个字符都存储在它在字符串中占据的位置 让您熟悉字符串与数组类似的一些示例: 'Good Morning' at: 3

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

fruit <- 'apple'

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

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

在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”分配给水果变量。 如果要创建新的strin,应该使用 (字节)新字符串: 类似 新阵列:


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

字符串是对象。对象包含实例变量并响应消息。在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个字符的空格的字符串。然后获取指向该对象的水果变量。然后将5个字符写入字符串。结果是字符串“apple”

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

fruit := 'apple'

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

“我没有时间正确学习smalltalk。您为什么要看smalltalk?我需要它来写我的学校论文。”。我在做一些类似于比较几种编程语言的某些部分的事情。。。对于字节可索引对象,您是否仍然认为在索引实例变量中引用它们是正确的。在字节可索引对象中找到的“字节”真的是对象吗?您可以获取表示它们的对象(字符和数字),但它们与那些字节不同。注意,“苹果”代表内存管理器必须担心的一个对象,而不是1+5。当然,这已经超过了“入门级”的解释。是的,它们是以不同的方式实现的,但是对于Smalltalk程序员来说,它们的外观就像对象一样。语言实现者选择如何表示数据并不重要。如果它看起来像一个对象,行为也像一个对象,那么它就是一个对象。我听人说,使用计算机语言,只要不被抓住,你就可以作弊。如果你给了我一棵在各个方面都无法与真树区分的假树,那么我仍然会称之为树。这对于形而上学来说是怎样的呢?但是在编译器开始处理语句之前,“apple”字符串并不存在?我的意思是当然包括解析