gpt4 book ai didi

smalltalk - 是否可以将消息分配给变量?

转载 作者:行者123 更新时间:2023-12-02 23:29:01 25 4
gpt4 key购买 nike

我正在研究不同类型的编程语言,以了解它们有何不同以及它们的优点/缺点。

我目前对使用消息进行方法调用的语言特别感兴趣;我想知道是否可以以某种方式将消息分配给 Squeak/Pharo/Smalltalk/etc 中的变量。

假设类 AB 都有消息 foo:;我怎样才能做这样的事情:

|msg| 
msg := foo: 12.
a msg.
b msg.

其中ab分别是AB的实例

最佳答案

Pharo 有 Message 类。所以你可以将其创建为

Message selector: #foo: argument: 12

但目前 Message 不用于执行目的。

您正在寻找的是执行:消息。

所以你可以像这样做你需要的事情:

| selector arg | 
selector := #foo:.
arg := 12.
a perform: selector with: arg.
b perform: selector with: arg

"for messages of other `shape`"
a perform: selector.
a perform: selector with: arg with: arg. "up to 3 args"
a perform: selector withArguments: { arg . arg }
<小时/>

至于花哨的语法

msg := foo: 12.

根据 Smalltalk 的说法,没有任何意义。但您可以做的是定义一个类似 GenericMessage 的类,其中包含 2 个实例变量:selectorarguments。然后你在类端重新定义 doesNotUnderstand: ,如下所示:

GenericMessage class >> doesNotUnderstand: aMessage

^ self new
selector: aMessage selector;
arguments: aMessage arguments;
yourself

然后您还为Object定义一个方法:

Object>>#performMessage: aGenericMessage

^ self
perform: aGenericMessage selector
withArguments: aGenericMessage arguments

然后你的代码将如下所示:

|msg| 
msg := GenericMessage foo: 12.
a performMessage: msg.
b performMessage: msg.

关于smalltalk - 是否可以将消息分配给变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35372961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com