【问题标题】:Keyword messages in smalltalk (Beginner)(Pharo)smalltalk 中的关键字消息(初学者)(Pharo)
【发布时间】:2012-04-07 09:09:18
【问题描述】:

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

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

提前致谢!

【问题讨论】:

    标签: smalltalk pharo squeak visualworks amber-smalltalk


    【解决方案1】:

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

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


    "MessageNotUnderstood: ByteString>>subst:by:"

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

    【讨论】:

    • "self" 是我最初尝试但没有奏效的方法(对不起,我应该在问题中指定)。除非我错过了其他错误。
    • @Uritomi 请量化“没用”。在您的问题中提供完整的错误消息以及产生它的代码。
    • 上面的代码就是我做的全部了,报错信息是:“MessageNotUnderstood: ByteString>>subst:by:”
    • 啊,好吧,这清除了很多信息。看来我和smalltalk还有很长的路要走哈哈,谢谢回复!
    • @Uritomi 正如我所说,您需要完成教程。还习惯性地通过投票和接受答案来表达您的感激之情。
    【解决方案2】:

    在 Smalltalk 中,方法不是独立的东西。

    方法是对象响应消息发送的方式。

    如果接收消息的事物知道如何响应消息,它就有一个响应消息的方法消息名称据说在对象的消息协议中。

    所以 - 每个消息都有一个接收者和一个消息名称

    关键字消息也将有一个或多个参数,每个参数都有一个关键字

    另一方面,所有方法都是对象的一部分。它们存储在对象的类定义中,作为类方法实例方法

    (唯一的例外是在称为 blocks 的匿名对象的特定情况下。在这些情况下,方法是在 block 定义中定义的)。

    这是一个示例关键字消息: Transcript show: 'Hello World!'

    意思是“将消息show: 'Hello World!'发送给接收者Transcript”。 (Transcript 是一个显示系统输出的窗口。所有图形化 Smalltalk 环境都有一个 Transcript 类)。

    消息包含三个部分:

    最左边的部分总是接收器。在这个例子中,receiverTranscript

    消息名称是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

    如果ByteString 类(或类层次结构中高于它的任何类,如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: string3string1 copyReplaceAll: string2 with: string3差别不大

    另一个需要注意的风格点是关键字消息中的每个关键字都应尽可能具有描述性和明确性。 subst 可能意味着 substitutesubstring

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      相关资源
      最近更新 更多