【问题标题】:Why this method's return part is not working为什么此方法的返回部分不起作用
【发布时间】:2019-05-12 14:14:50
【问题描述】:

我正在尝试编写一个返回新值的方法。以下代码由here修改:

| stripChars |
stripChars := [ :string :chars |    
    str := string reject: [ :c | chars includes: c ].
    str displayNl.          "THIS WORKS."
    ^ str                   "THIS DOES NOT WORK."
].

newstr := stripChars 
    value: 'She was a soul stripper. She took my heart!'
    value: 'aei'.
newstr displayNl.

上述函数虽然创建了新字符串并显示,但返回或接收返回的新字符串时出错:

$ gst make_fn_ques.st
Sh ws  soul strppr. Sh took my hrt!
Object: 'Sh ws  soul strppr. Sh took my hrt!' error: return from a dead method context
SystemExceptions.BadReturn(Exception)>>signal (ExcHandling.st:254)
SystemExceptions.BadReturn class(Exception class)>>signal (ExcHandling.st:151)
String(Object)>>badReturnError (Object.st:1389)
UndefinedObject>>executeStatements (make_fn_ques.st:10)
nil

问题出在哪里,如何解决?感谢您的帮助。

【问题讨论】:

  • 请注意,您的 stripChars 既不是函数也不是方法。它被称为块。它是一个可调用的闭包,属于封闭的方法上下文(类似于堆栈帧)。
  • 您可以简单地使用string reject: [ :c | chars includes: c ],无需变量赋值。
  • 备注:从你最近的问题我得到的印象是你正在努力学习smalltalk。 GST 并不是最合适的平台,它的优势在别处。使用基于图像和 GUI 的 Smalltalks 之一(如 Pharo、Squeak 或 Cuis)可能会让您的学习体验更好。
  • 感谢您的建议。我不知道CuisGST 的主要优势是什么?

标签: function methods smalltalk gnu-smalltalk


【解决方案1】:

^ str

不从块返回(stripChars),而是从封闭方法返回(非本地返回)。

显然 GNU Smalltalk 不允许您以这种方式从传递给 gst 的脚本返回。

只需删除 ^,并仅保留 str 作为块的最后一个表达式。这将导致str 成为块的返回值。

【讨论】:

  • 是的,它有效。谢谢。我之前有一个类似的问题,我无法得到可接受的答案:stackoverflow.com/questions/56086816/…
  • No Smalltalk 方言由于其语义而不允许从脚本块返回非本地返回。非本地返回应该将执行流带到定义块的方法的发送者,如果块已被编写脚本并保存在变量中,这是不可能的。由于执行流程无处可去,系统发出错误信号(没有其他选择)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
相关资源
最近更新 更多