我正在尝试创建一个关键字消息样式的方法,但我不知道如何从该方法内部访问Receiver。我相信这很简单,但是我在任何地方都找不到答案。我试图实现的是多余的,但我仍然想知道它是如何工作的。
subst: i1 by: i2
^ self copyReplaceAll: i1 with: i2.
它将在工作区中调用如下:
string1 := 'Lemon'.
string2 := 'm'.
string3 := 'ss'.
string1 subst: string2 by: string3.
错误消息:"MessageNotUndertood:ByteString>>子字符串:由:"
该方法所要做的就是用"ss"替换"Lemon"中每次出现的"m",以创建"Lesson"(copyReplaceAll已经这样做了)。我不知道如何将string1放入该方法中。任何帮助都将不胜感激,
提前感谢!
self
是当前对象(即接收器)。
请阅读(或至少略读)教程以获得基本知识
"MessageNotUnderstood: ByteString>>subst:by:"
此错误表示您尚未在ByteString上定义消息。要么你没有在任何地方真正定义它,要么你在错误的类上定义了它。
在Smalltalk中,方法不是独立的东西。
方法是对象响应消息发送的方式。
如果接收消息的东西知道如何响应消息,那么它就有一个响应消息的方法。消息名称据说在对象的消息协议中。
因此,每个消息都有一个接收器和一个消息名称。
关键字消息也将有一个或多个参数,每个参数有一个关键字。
另一方面,所有方法都是对象的一部分。它们存储在对象的Class定义中,作为Classmethod或实例方法。
(唯一的例外是称为块的匿名对象的特定情况。在这些情况下,方法是在的块定义中定义的)。
以下是一个示例关键字消息:Transcript show: 'Hello World!'
意思是"向接收方Transcript
发送消息show: 'Hello World!'
"。(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
然后可以在工作空间中调用它,如下所示:
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"键盘快捷键。尽管鼠标和键的映射在不同的平台上可能有所不同)。