我遇到以下问题:
t := #(1,2,3)
t at: 1 -> 1
t at: 2 -> #,
这对我来说有问题, 如何获得以下效果:
t at 1 -> 1
t at 2 -> 2
答案 0 :(得分:6)
#(1,2,3)
是一个数组文字,其中元素由空格或类型分隔,因此最后得到一个包含5个项目的数组,其中两个是逗号符号:#,
({{1用于显示符号文字)。
您需要将数组定义为#
。
还有一个数组表达式:#(1 2 3)
,但这是评估的东西。例如,您可以使用文字数组{1 . 2 . 3}
执行{1 . 2 . 2 + 4 . a + b}
,因为必须在编译时定义它们。例如。我在编译时不知道我使用的变量#()
和a
答案 1 :(得分:5)
行。让我们借此机会提供更完整的文字描述。
Smalltalk中有几种类型的文字
<强>整数强>
十进制
10
-1
0
1000000000000000000000000000000000000000000
十六进制
16rAB1F
16r0
-16rFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
ScaledDecimal
17s0
3.14159265s8
其他的
8r7731 (octal)
2r1001 (binary)
10r99987 (decimal again!)
etc.
<强>字符强>
$A (uppercase)
$a (lowercase)
$ (space!)
$→ (unicode)
$1 (not to be confused with 1)
<强>字符串强>
'' (empty string)
' ' (string with 1 space)
'Hello world'
<强>符号强>
#hello
#'hello world'
#'' (empty symbol, not very useful)
#+
#1 (not the integer 1)
<强>的ByteArray 强>
#[1 2 3 4] (separators are blank)
#[] (empty ByteArray)
#[0 0 0 0 255] (length is arbitrary)
<强>阵列强>
#(256 16rAB1F 3.14s2 2r1001 $A #this)
请注意,文字数组使用任何种类和数量的空格作为separtors
#(256
16rAB1F
3.14s2
2r1001
$A #this) (same as above)
另请注意,您可以撰写文字
#[255 16rFF 8r377 2r11111111] (four times 255)
#(#[1 2 3] #('string' #symbol)) (arrays of arrays)
有一些“放宽符号的宽容度”
#(symbol) = #(#symbol) (missing # => symbol)
#('string' ($a 'a')) (missing # => array)
但不是在这里:
#([1 2 3]) ~= #(#[1 2 3]) (missing # => misinterpreted)
然而
#(true nil false) (pseudo variables ok)
但不是在这里!
#(self) = #(#self) (missing # => symbol)
正如您所看到的,存在一些不一致之处:
<强>一个即可。虽然伪变量true
,false
和nil
在数组中被接受为文字,但伪变量self
和super
被解释为符号(使用更一般不合格字符串的规则。)
<强> B'/ strong>即可。虽然编写#并不是强制性的(为了在数组中启动嵌套数组并且括号足够,但必须编写#[用于启动嵌套的ByteArray。