gnu smalltalk 教程-一些类

本章的类需要代码创建。如果需要销毁所有你储存的对象,在最后使用感叹号标志
现在,来看看这几个新的类

Arrays 数组

Smalltalk中的数组类似于其他语言,虽然他的符号看起来很奇特.创建一个20个空间的数组

x := Array new: 20

其中Array new: 20 创建了数组对象; x := 将名字x和Array new:20创建的对象链接起来. 直到你给x分配其他的东西之前,你都可以用x来引用这个数组对象. 改变数组中的元素并不使用 := 操作符; 这个操作符仅用于名字绑定到对象. 事实上, 你从不修改数据结构; 替代的是,你发送消息给对象,使其自生修改。
例子:

x at: 1

which prints:
nil
array的槽被初始化为空 (Smalltalk中的nil).

现在设置第一个槽为99:

x at: 1 put: 99

然后确定一下99是否已存入:

x at: 1

之后输出第一个槽的结果:
99

这里的例子显示了如何操作数组. 这里也展示了保准情况下消息传递参数的方式。通常情况下,如果消息代参数, 消息名以`:'结尾
所以当我门这样写的时候 x at: 1 我们发送一个消息给某个当期绑定x的对象带着参数1. 对于一个数组,他的结果返回数组对象的第一个槽的值.
第二个操作, x at: 1 put: 99 是一个消息带着两个值. 它告诉数组对象用第二个参数99替换由第一个参数指定的槽(数组的第一个元素). 第三个操作我们检测了数组的第一个槽,其确实是99
你发送给对象的消息是个描述性的简写,你仅仅同时运行消息。所以我们应该说,我们的数组接收at:和at:put: 消息

Set 集合

我们用完了array,所以,我们给分配一些新的东西给x. 值得注意的是,我木不需要对不用的数组作任何处理:事实上,当无人使用的时候对象会被自动删除释放。 这是众所周知的垃圾回收系统,当内存不足时会被运行。好,我们来看看新的对象set

x := Set new

这个创建了一个空的集合。我们直接输入变量x来查看

x

这一类对象会打印出其内容 (i.e., Set), 括号内显示其元素. 应为其为空, 我们可以看到结果返回:

Set ()
现在让我门折腾些东西到集合里. 我们将要添加 5 和 7, 加上 'foo'. 这也是第一个例子我们使用不止一个语句。从而引出语句分隔符 . 点号

x add: 5. x add: 7. x add: 'foo'

类似Pascal, 不像 C, 声明被分割了而非被终结. 因而当完成一个语句用 . 开始新的一句。这就是为什么最后一句没有使用. 而是直接换行。当然,Smalltalk不会埋怨你在最后输入一个无效的语句分隔符。

我们还可以使用更简便的方法来完成上面的功能:

x add: 5; add: 7; add: 'foo'

这一行和之前一行作用一样。分号操作符使消息传递到于之前消息被传递到的想同的对象。所以 ; add: 7 和 x add: 7相同,应为之前的消息传递给了x.

这个看起来没有节省多少,不过如果变量名是aVeryLongVariableName。。。让我门回到之前所说的,保证你有一个名为x的集合包含了 5, 7, and “foo”:

x

我们能看到x当前包含的数据

Set ('foo' 5 7)
加入我们add某个东西两次会发生什么?

x add:5; add: 5; add: 5; add: 5;

我们添加了5次5,但是我们看到依旧只有一个5

Set ('foo' 5 7)
yourself 通常用在一串语句的最后,如果仅仅是对对象本身感兴趣,而对于add:5的返回值并不感兴趣,使用youreself可以返回对象本身,它是一个一元消息,就像printNl

x yourself

对于集合可以使用 add:添加数据, 也可以使用 remove: 删除。

x remove: 5
x printNl

The set now prints as:

Set ('foo' 7)
“5”已经被删除了.

我们通过一个可以让你干很多事情的集合检测的消息结束集合的介绍,试试:

        x includes: 7
        x includes: 5

我们看到x中包含了7,但是没有5. 返回值打印成 true 或者 false. 返回值更具是否包含指定的元素来决定,返回一个布尔对象. 我们在后面再看利用布尔对象, 目前,我门仅仅说布尔形仅仅是一个不是真则是假的对象 。 所以对回答是或不是的问题非常有用. 让我看看更多的数据结构

Dictionaries 字典

字典是一种特殊的集合.使用规律的数组,你必须用整数作为索引. 用字点,你可以用任意对象索引. 因而字典提供了一种有效的从一个对象关联到其他信息的方法. 惟一的劣势是比简单数组效率略差,试试下面的代码:

        y := Dictionary new
        y at: 'One' put: 1
        y at: 'Two' put: 2
        y at: 1 put: 'One'
        y at: 2 put: 'Two'

这段用一些数据填充了我门的字典. 这些数据已经被存储为字和值(字就可以通过 at:字来索引 值就是实际存储在槽里的). 注意的是我们不但可以用整形,而且可以用字符串作为字或者值。事实上,我们可以用我们任意想用的对象,字典并不在乎.

现在我们可以查找任意字对应的值:

        y at: 1
        y at: 'Two'

应该显示的结果:
'One'
2

我么通过以下方式打印字典本身:

        y

打印内容:
Dictionary (1->'One' 2->'Two' 'One'->1 'Two'->2 )
->之前的是字, 之后的是值. 是时候关注发送释放消息来释放我们创建的对象了, and send them to oblivion:

        y
        x!

感叹号标志删除gnu Smalltalk's 所有已值变量. 再次访问这些变量将会返回nil.

结语

你已经见识到了Smalltalk如何提供给你这些给力的数据结构。 你也见识到了Smalltalk编程的一些工具。但这些仅仅是Smalltalk的冰山一脚,他还有很多优雅的工具可用。这些原生的对象很方法仅仅是创建你自己的对象和方法的基础,你可以使用自己的对象在任何地方。Smalltalk的编程艺术实际是你的团队看待问题的艺术,使用存在对象效果良好,同时用新的对象增强Smalltalk。目前,你已经接触到了Smalltalk的基础操作,让我们在下一步分开始关注面向对象编程技术。