2012-05-16 15 views
3

我在Smalltak noobie,但我需要了解我的论文的一些事情。创建字符串或其他对象时究竟发生了什么?例如,让我们这样做:在smalltalk中创建字符串时会发生什么?

fruit <- 'apple' 

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

+1

“我没有时间好好学Smalltalk:你为什么在Smalltalk中寻找呢? – Mark

+0

我需要它作为我的学校论文。我正在做一些比较少数几种编程语言的东西。 – peto1234

回答

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个字符空格的字符串。然后它得到水果变量指向那个对象。然后它在字符串中写入5个字符。结果是字符串'apple'。

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

fruit := 'apple' 

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

+0

琐碎的迂腐问题大卫的分析......在字节的可转位对象的情况下,你仍然认为这是正确的称它们为在索引实例变量。字节索引对象中的“字节”是否真的是对象?您可以获取表示它们的对象(字符和数字),但它们与这些字节不同。 IOW,“Apple”代表内存管理器必须担心的一个对象,而不是1 + 5.这当然超过了“入门级”的解释。 –

+0

是的,它们是以不同的方式实现的,但Smalltalk程序员的外观就是它们表现得像对象一样。语言实施者如何选择代表数据并不重要。如果它看起来像一个对象并且表现得像一个对象那么它就是一个对象。我听说它用电脑语言说,只要你不被抓到就可以作弊。如果你给了我一棵在各方面与真树无法区分的假树,那么我仍然会称它为一棵树。那对形而上学来说如何? –

3

字符串是可转位的对象,这意味着它们是数组和插槽编号,而不是“标着” ...

4

他们不是实例变量,他们在可转位对象位置,非常相似当你创建一个数组或任何其他类型的集合时会发生什么。

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

正如你所看到的,字符串只是另一种收藏。

3

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

fruit := 'apple' 

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

这是怎么编译器编译源代码时实际创建新的字符串。

+0

但编译器开始处理语句之前'apple'字符串不存在?我的意思当然包括 –

相关问题