在 Smalltalk 中,方法不是独立的东西。
方法是对象响应消息发送的方式。
如果接收消息的事物知道如何响应消息,那么它就有了响应消息的方法。据说消息名称在对象的消息协议中。
所以——每条消息都有一个接收者和一个消息名称。
关键字消息也将有一个或多个参数,每个参数都有一个关键字。
另一面是所有方法都是对象的一部分。它们存储在对象的类定义中,作为类方法或实例方法。
(唯一的例外是在称为块的匿名对象的特定情况下。在这些情况下,该方法在块定义中定义)。
这是一个示例关键字消息:
Transcript show: 'Hello World!'
它的意思是“将消息发送show: 'Hello World!'
给接收者Transcript
”。(Transcript 是一个显示系统输出的窗口。所有图形 Smalltalk 环境都有一个 Transcript 类)。
此消息包含三个部分:
最左边的部分始终是接收器。在这个例子中,接收者是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
Class (或在 Class 层次结构中高于它的任何 Class,如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”键盘快捷键。虽然鼠标和键映射在不同平台上可能会有所不同)。