【问题标题】:What happens when creating string in smalltalk?在 smalltalk 中创建字符串时会发生什么?
【发布时间】:2012-05-16 19:13:36
【问题描述】:

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

fruit <- 'apple'

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

【问题讨论】:

  • ' 我没时间好好学习 smalltalk。:那你为什么要看 smalltalk?
  • 我的学校论文需要它。我正在做一些类似于比较几种编程语言的某些部分的事情。

标签: object smalltalk


【解决方案1】:

字符串是对象。对象包含实例变量并响应消息。在 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 对象的索引实例变量。

【讨论】:

  • 琐碎的迂腐问题大卫......在字节可索引对象的情况下,您仍然认为在索引实例变量中引用它们是否正确。在字节可索引对象中找到的“字节”是真正的对象吗?您可以获取代表它们的对象(字符和数字),但它们与那些字节不同。 IOW,'Apple' 代表内存管理器必须担心的一个对象,而不是 1 + 5。这当然超出了“入门级”的解释。
  • 是的,它们以不同的方式实现,但是对于 Smalltalk 程序员来说,它们的行为就像对象一样。语言实现者如何选择表示数据并不重要。如果它看起来像一个对象并且行为像一个对象,那么它就是一个对象。我听说用计算机语言,只要不被抓住,你就可以作弊。如果你给我一棵在各方面都和真树没有区别的假树,那我还是叫它树。形而上学怎么样?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      fruit := 'apple'
      

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

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

      【讨论】:

      • 但是在编译器开始处理语句之前'apple'字符串不存在?我的意思是当然包括解析
      • 使用单引号确实会创建一个 ByteString 的实例(String 的一个特殊子类),这可以通过评估 'foobar' class name. 很容易看出,在打印时会产生符号#ByteString.
      猜你喜欢
      • 2018-10-23
      • 1970-01-01
      • 2022-06-17
      • 2021-05-23
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多