smalltalk - 从Array获取元素

1 smalltalk

我有以下问题:

t := #(1,2,3)
t at: 1  -> 1
t at: 2  -> #,  
Run Code Online (Sandbox Code Playgroud)

这对我来说是个问题,如何获得以下效果:

t at 1 -> 1
t at 2 -> 2
Run Code Online (Sandbox Code Playgroud)

Uko*_*Uko 6

#(1,2,3)是一个数组字面其中元件或者通过空间或通过分离型,所以在端你得到的阵列用5项其中两个是逗号符号:#,(#用于显示符号文字).

您需要将数组定义为#(1 2 3).

还有一个数组表达式:{1 . 2 . 3},但这是评估的东西.例如,你可以做{1 . 2 . 2 + 4 . a + b}一些你不能用文字数组做的事情,#()因为它们必须在编译时定义.例如,在编译期间我不知道变量ab我使用的变量


Lea*_*lia 5

好.让我们借此机会提供更完整的文字描述.

Smalltalk中有几种类型的文字

整型

  1. 十进制

    10
    -1
    0
    1000000000000000000000000000000000000000000
    
    Run Code Online (Sandbox Code Playgroud)
  2. 十六进制

    16rAB1F
    16r0
    -16rFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    
    Run Code Online (Sandbox Code Playgroud)
  3. ScaledDecimal

    17s0
    3.14159265s8
    
    Run Code Online (Sandbox Code Playgroud)
  4. 其他

    8r7731                             (octal)
    2r1001                             (binary)
    10r99987                           (decimal again!)
    etc.
    
    Run Code Online (Sandbox Code Playgroud)

人物

   $A                                  (uppercase)
   $a                                  (lowercase)
   $                                   (space!)
   $?                                  (unicode)
   $1                                  (not to be confused with 1)
Run Code Online (Sandbox Code Playgroud)

字符串

   ''                                  (empty string)
   ' '                                 (string with 1 space)
   'Hello world'
Run Code Online (Sandbox Code Playgroud)

符号

   #hello
   #'hello world'
   #''                                 (empty symbol, not very useful)
   #+
   #1                                  (not the integer 1)
Run Code Online (Sandbox Code Playgroud)

的ByteArray

   #[1 2 3 4]                          (separators are blank)
   #[]                                 (empty ByteArray)
   #[0 0 0 0 255]                      (length is arbitrary)
Run Code Online (Sandbox Code Playgroud)

数组

   #(256 16rAB1F 3.14s2 2r1001 $A #this)
Run Code Online (Sandbox Code Playgroud)

请注意,文字数组使用任何种类和数量的空格作为separtors

   #(256
     16rAB1F
     3.14s2
     2r1001
     $A #this)                         (same as above)
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以撰写文字

   #[255 16rFF 8r377 2r11111111]       (four times 255)

   #(#[1 2 3] #('string' #symbol))     (arrays of arrays)
Run Code Online (Sandbox Code Playgroud)

有一些"容忍*宽松的符号

   #(symbol) = #(#symbol)              (missing # => symbol)

   #('string' ($a 'a'))                (missing # => array)
Run Code Online (Sandbox Code Playgroud)

但不是这里:

   #([1 2 3]) ~= #(#[1 2 3])           (missing # => misinterpreted)
Run Code Online (Sandbox Code Playgroud)

然而

   #(true nil false)                   (pseudo variables ok)
Run Code Online (Sandbox Code Playgroud)

但不是在这里!

   #(self) = #(#self)                  (missing # => symbol)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,存在一些不一致之处:

a.而伪变量true,falsenil被接受为文本内部阵列,伪变量selfsuper被解释为符号(使用不合格的字符串的更一般的规则.)

b.虽然写#不是强制性的(为了在数组中启动嵌套数组并且括号足够,但必须编写#[用于启动嵌套的ByteArray.