[英]Keyword messages in smalltalk (Beginner)(Pharo)
我正在尝试创建一个关键字消息样式方法,但我无法弄清楚如何从方法内部访问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放入方法中。 任何帮助将不胜感激,
提前致谢!
self
是当前对象(即接收者)。
请阅读(或至少略读)一个教程以获得基础知识。
"MessageNotUnderstood: ByteString>>subst:by:"
此错误意味着您尚未在ByteString上定义消息。 您可能无法在任何地方实际定义它,或者您已在错误的类上定义它。
在Smalltalk中, 方法不是独立的东西。
方法是对象响应消息发送的方式 。
如果接收消息的事情知道如何响应该消息,它具有响应消息的方法 。 消息名称被称为对象的消息协议 。
所以 - 每条消息都有一个接收者和一个消息名称 。
关键字消息还将具有一个或多个参数 ,每个参数都有一个关键字 。
另一方面, 所有方法都是对象的一部分 。 它们作为Class方法或实例方法存储在对象的Class定义中 。
(唯一的例外是在称为块的匿名对象的特定情况下。在这些情况下,该方法在块定义中定义 )。
这是一个示例关键字消息: Transcript show: 'Hello World!'
这意味着“发送消息show: 'Hello World!'
到收件人Transcript
“。 (Transcript是一个显示系统输出的窗口。所有图形Smalltalk环境都有一个Transcript类)。
此消息包含三个部分:
最左边的部分始终是接收器 。 在此示例中, 接收器是Transcript
。
消息名称为show:
其中包含一个关键字show:
争论的焦点是'Hello World'
(对Transcript show: 'Hello World!'
更全面的解释Transcript show: 'Hello World!'
可以在[ http://beginningtosmalltalk.blogspot.com/2015/11/hello-world.html]找到
包含多个关键字的示例关键字消息:
aByteString copyReplaceAll: i1 with: i2
接收器是aByteString
,Class 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
然后可以在工作区中调用它,如下所示:
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'键盘快捷键。虽然鼠标和键映射可能在不同的平台上有所不同)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.