arrays - Smalltalk阵列类型

标签 arrays smalltalk squeak

在查看Smalltalk语法定义时,我注意到数组有一些不同的表示法:

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

    以下是一些演练:

    首先,我们可以找到相应的类型。结果对象的类:

  • #[] class结果为ByteArray
  • #() class结果为Array
  • {} class也产生Array

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

    现在我们必须找出#(){}之间的区别。尝试评估#(a b c),结果为#(#a #b #c);但是,当您尝试评估{a b c}时,它不起作用(因为未定义a)。工作版本为{#a. #b. #c},这也将生成#(#a #b #c)
    #(){}之间的区别在于,第一个输入一个由空格分隔的符号名称列表。您也可以省略#标志。使用此表示法只能创建包含符号的数组。第二个版本是通用数组文字。它接受任何表达式,并用.(点)分隔。您甚至可以编写诸如{1+2. anyObject complexOperation}之类的东西。

    这可能会导致您始终使用{}表示法。但是,需要牢记一些注意事项:创建对象的时刻有所不同:虽然在编译过程中创建了#()数组,但在执行过程中创建了{} Array。因此,当您使用#()表达式运行代码时,它也会返回相同的数组,而{}仅返回相等的数组(只要您使用相等的内容)。同样,AFAIK {}不一定是可移植的,因为它不是ST-80标准的一部分。

    关于arrays - Smalltalk阵列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14547449/

    相关文章:

    indentation - Squeak 中的 Smalltalk 代码如何自动缩进?

    python - 通过列表引用类实例

    python - 插入排序对于逆序数组来说快得离谱

    smalltalk - 如何在 Squeak Smalltalk 中使用多线程?

    smalltalk - "self class"如何使用?/Pharo图像如何查询?

    smalltalk - 如何向用户询问文件名?

    string - Smalltalk - 插入 TAB 字符 (Visual Works)

    javascript - 将js数组转换为字典映射

    php - 选择定义了其他列的 mysql 列(即数组),:- and insert it into php variable

    smalltalk - 如何在 smalltalk 中显示消息框? (吱)