1

我正在尝试创建一个关键字消息样式方法,但我不知道如何从方法内部访问接收器。我确信这很简单,但是我无法在任何地方找到答案。我试图实现的是多余的,但我仍然想知道它是如何工作的。

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 放入该方法中。任何帮助将不胜感激,

提前致谢!

4

2 回答 2

3

self是当前对象(即接收者)。

请阅读(或至少略读)教程以获取基础知识。


"MessageNotUnderstood: ByteString>>subst:by:"

此错误表示您尚未在 ByteString 上定义消息。要么你没有在任何地方实际定义它,要么你在错误的类上定义了它。

于 2012-03-22T18:57:37.560 回答
0

在 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:

论据是i1i2

如果ByteStringClass (或在 Class 层次结构中高于它的任何 Class,如String)包含该方法,则消息在对象的协议中。

string1 := 'Lemon' . string1 copyReplaceAll: i1 with: i2

如果需要,您可以将代码添加到StringByteString作为附加方法。

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可能意味着substitutesubstring

将方法添加到类的最简单方法是使用系统浏览器。单击系统浏览器中的类,一个形式上的方法定义将出现在编辑窗格中。

改写它,并且Accept it(在我的系统上通过右键单击 2 或 3 键鼠标,或“Ctrl-s”键盘快捷键。虽然鼠标和键映射在不同平台上可能会有所不同)。

于 2015-11-15T23:46:54.657 回答