我正在尝试创建关键字消息样式方法,但我无法弄清楚如何从方法内部访问Receiver。我确信这很简单,但我无法在任何地方找到答案。我想要实现的是多余的,但我仍然想知道它是如何工作的。
subst: i1 by: i2
^ self copyReplaceAll: i1 with: i2.
它将在工作区中调用,如下所示:
string1 := 'Lemon'.
string2 := 'm'.
string3 := 'ss'.
string1 subst: string2 by: string3.
错误消息:“MessageNotUnderstood:ByteString>> subst:by:”
所有方法应该做的是用“ss”替换“Lemon”中每个“m”的出现,以创建“Lesson”(copyReplaceAll已经执行)。我无法弄清楚如何将string1放入方法中。任何帮助将不胜感激,
提前致谢!
答案 0 :(得分:3)
self
是当前对象(即接收者)。
请阅读(或至少略读)教程以获得基础知识。
"MessageNotUnderstood: ByteString>>subst:by:"
此错误表示您尚未在ByteString上定义消息。您可能无法在任何地方实际定义它,或者您已在错误的类中定义它。
答案 1 :(得分:0)
在Smalltalk中,方法不是独立的东西。
方法是对象响应消息发送的方式。
如果收到该消息的内容知道如何响应该消息,则它具有响应该消息的方法。 消息名称据说位于对象的消息 protocol 中。
所以 - 每条消息都有一个接收器和一个消息名称。
关键字消息还将包含一个或多个参数,每个参数都有一个关键字。
另一方面,所有方法都是对象的一部分。它们存储在对象的类定义中,作为类方法或实例方法。
(唯一的例外是在名为 blocks 的匿名对象的特定情况下。在这些情况下,该方法在块定义中定义。)
以下是关键字消息示例:
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(或类层次结构中的任何类,如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
向Class添加方法的最简单方法是使用系统浏览器。单击系统浏览器中的类,并在编辑窗格中显示形式方法定义。
改写它,Accept it
(在我的系统上通过右键单击2或3键鼠标,或'Ctrl-s'键盘快捷键。虽然鼠标和键映射可能因平台而异) 。