首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smalltalk数组类型

Smalltalk数组类型
EN

Stack Overflow用户
提问于 2013-01-27 12:44:09
回答 2查看 6.8K关注 0票数 9

在查看Smalltalk语法定义时,我注意到数组有几个不同的符号:

代码语言:javascript
复制
#[] "ByteArray"
#() "Literal Array"
{}  "Array"
  • 为什么有不同的数组类型?在其他编程语言中,我知道只有一种与存储类型无关的数组。
  • 什么时候选择哪种?
  • 为什么文字数组和数组有不同的表示法,但有相同的类?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-27 13:00:45

下面是一个小演练:

首先,我们可以找出resp的类型。生成对象的类:

  • #[] class导致ByteArray
  • #() class导致Array
  • {} class也会导致Array

因此,显然后两个产生数组,而第一个生成一个ByteArray。ByteArrays是您所期望的--固定大小的字节数组。

现在我们必须找出#(){}之间的区别。尝试评估#(a b c),它会导致#(#a #b #c);然而,当您试图计算{a b c}时,它不起作用(因为a没有定义)。工作版本将是{#a. #b. #c},这也会导致#(#a #b #c)

#(){}的不同之处在于,第一个符号名的列表由空格分隔。您还可以省略#标志。使用此表示法,只能创建包含符号的数组。第二个版本是泛型数组文本。它使用任何表达式,用. (点)分隔。您甚至可以编写类似于{1+2. anyObject complexOperation}的东西。

这可能会导致您始终使用{}符号。但是,有一些事情要记住:对象创建的时刻不同:#()数组是在编译期间创建的,而{}数组是在执行过程中创建的。因此,当您使用#()表达式运行代码时,它也将返回相同的数组,而{}只返回相同的数组(只要您使用的内容相同)。而且,AFAIK {}不一定是可移植的,因为它不是ST-80标准的一部分。

票数 11
EN

Stack Overflow用户

发布于 2013-01-27 16:47:11

在迈克尔的回答中有一些术语上的混乱,#()是一个文字数组,而{}不是。文字数组是编译器创建的数组,可以包含任何其他文字值(包括其他文字数组),因此下面是一个有效的文字数组:

代码语言:javascript
复制
#(1 #blah nil ('hello' 3.14 true) $c [1 2 3])

另一方面,{}只是运行时数组创建的语法糖,因此{ 1+2. #a. anObject}相当于:

代码语言:javascript
复制
(Array new: 3) at: 1 put: 1 + 2; at: 2 put: #a; at: 3 put: anObject; yourself
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14547449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档