smalltalk - 从Array获取元素

时间:2016-06-14 16:07:14

标签: smalltalk

我遇到以下问题:

t := #(1,2,3)
t at: 1  -> 1
t at: 2  -> #,  

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

t at 1 -> 1
t at 2 -> 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中有几种类型的文字

<强>整数

  1. 十进制

    10
    -1
    0
    1000000000000000000000000000000000000000000
    
  2. 十六进制

    16rAB1F
    16r0
    -16rFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    
  3. ScaledDecimal

    17s0
    3.14159265s8
    
  4. 其他

    8r7731                             (octal)
    2r1001                             (binary)
    10r99987                           (decimal again!)
    etc.
    
  5. <强>字符

       $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)
    

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

    <强>一个即可。虽然伪变量truefalsenil在数组中被接受为文字,但伪变量selfsuper被解释为符号(使用更一般不合格字符串的规则。)

    <强> B'/ strong>即可。虽然编写#并不是强制性的(为了在数组中启动嵌套数组并且括号足够,但必须编写#[用于启动嵌套的ByteArray。