我想返回传递给块的值。如果它是一个数字,一切都很好,但如果我输入一个字符串或布尔值,我会得到一个“消息不理解”。
q := [ :a | a].
Transcript show: ((q value:'123') value) printString.
我以为一切都是一样的,所以我很困惑。但我想我只是错过了一些东西。
编辑:它似乎在 Pharo 下工作......
我想返回传递给块的值。如果它是一个数字,一切都很好,但如果我输入一个字符串或布尔值,我会得到一个“消息不理解”。
q := [ :a | a].
Transcript show: ((q value:'123') value) printString.
我以为一切都是一样的,所以我很困惑。但我想我只是错过了一些东西。
编辑:它似乎在 Pharo 下工作......
VisualWorks 中的对象未实现消息“值”。一些应用程序添加了它,但它不在基类库中。在 VisualWorks 的某些版本中,它滑入了基类库,后来又被删除了。
如果您这样编写代码,它将起作用:
q := [ :a | a].
Transcript show: (q value:'123') printString.
删除发送#value
。正如您所描述的那样,您的示例没有必要。#value:
被发送到 Block,它会根据需要返回参数。然后你发送#value
到参数,它在 Pharo 中有效,因为它返回 self 并且本质上是一个非操作。
这解决了您的错误,因为正如我怀疑和大卫验证的那样, VisualWorks Strings DNU #value
。
nb 正如鲍勃所说,您问题中缺少的关键信息是“哪个对象 DNU 哪个消息?” 一般来说,您对错误的描述越具体,答案就越好。
对我来说很好。
| q |
q := [ :a | a].
Transcript show: ((q value: true) value) printString.
| q |
q := [ :a | a].
Transcript show: ((q value: 123) value) printString.
如果您有 DNU 异常,您将能够看到哪个对象正在接收无法理解的消息。发布该信息。