在查看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/