在 Smalltalk 中,方法不是独立的东西。
方法是对象响应消息发送的方式。
如果接收消息的事物知道如何响应消息,它就有一个响应消息的方法。 消息名称据说在对象的消息协议中。
所以 - 每个消息都有一个接收者和一个消息名称。
关键字消息也将有一个或多个参数,每个参数都有一个关键字。
另一方面,所有方法都是对象的一部分。它们存储在对象的类定义中,作为类方法或实例方法。
(唯一的例外是在称为 blocks 的匿名对象的特定情况下。在这些情况下,方法是在 block 定义中定义的)。
这是一个示例关键字消息:
Transcript show: 'Hello World!'
意思是“将消息show: 'Hello World!'发送给接收者Transcript”。 (Transcript 是一个显示系统输出的窗口。所有图形化 Smalltalk 环境都有一个 Transcript 类)。
此消息包含三个部分:
最左边的部分总是接收器。在这个例子中,receiver 是Transcript。
消息名称是show:,其中有一个关键字show:
参数是'Hello World'
(对Transcript show: 'Hello World!'的更全面的解释
可以在
[http://beginningtosmalltalk.blogspot.com/2015/11/hello-world.html]
包含多个关键字的示例关键字消息:
aByteString copyReplaceAll: i1 with: i2
接收者是aByteString,是ByteString类的一个实例
消息名称为copyReplaceAll:with:,有两个关键字copyReplaceAll:和with:。
参数是i1 和i2。
如果ByteString 类(或类层次结构中高于它的任何类,如String)包含该方法,则消息位于对象的协议中。
string1 := 'Lemon' .
string1 copyReplaceAll: i1 with: i2
如果需要,您可以将代码添加到 String 或 ByteString 作为附加方法。
subst: i1 by: i2
"Substitute all instances of substring i1 with string i2.
Return the receiver"
^ self copyReplaceAll: i1 with: i2
那么就可以在workspace中调用如下:
string1 := 'Lemon'.
string2 := 'm'.
string3 := 'ss'.
string1 subst: string2 by: string3
但是string1 subst: string2 by: string3和string1 copyReplaceAll: string2 with: string3差别不大
另一个需要注意的风格点是关键字消息中的每个关键字都应尽可能具有描述性和明确性。 subst 可能意味着 substitute 或 substring
将方法添加到类的最简单方法是使用系统浏览器。单击系统浏览器中的类,编辑窗格中将出现一个形式上的方法定义。
改写它,然后Accept it(在我的系统上,通过右键单击 2 或 3 键鼠标,或“Ctrl-s”键盘快捷键。虽然鼠标和键映射在不同平台上可能有所不同)。