smalltalk - 如何将 block 循环中包含的变量返回到 pharo 中的方法

标签 smalltalk pharo pharo-5

假设我有一个方法,它实现了 do:[] every:40s block 。 block 中有一个应在每次延迟时返回的值数据。我如何将其重新调整为 pharo 中的方法,如下所示:

Class>>updateMethod

"This is a method"
| scheduler data |
scheduler := TaskScheduler new.
scheduler start.
"refresh every 40 seconds"
scheduler
   do: [a get: 'https://MyServer/json'.
        Transcript show: 'Refreshing......'; cr.
        data := NeoJSONReader fromString: a contents; cr.
   every: 60 seconds

最佳答案

如果我理解你的问题,这里的问题是你不能使用诸如 ^data 之类的表达式来返回接收到的数据,因为返回运算符 ^ 将退出 block 。

因此,要实现所需的行为,您需要在消息中发送收到的数据。大致如下:

| scheduler data |
scheduler := TaskScheduler new.
scheduler start.
scheduler
  do: [a get: 'https://MyServer/json'.
    Transcript show: 'Refreshing......'; cr.
    data := NeoJSONReader fromString: a contents; cr.
    self processData: data].
  every: 40 seconds.

这样,在每次评估 block 时,您的代码将有机会接收新的数据处理它。

附录:选择器processData:只不过是实际消息的提示或占位符,它将对刚刚读取的数据执行某些操作。换句话说,您应该创建这样一个方法,并将应用程序中所需的数据处理放入其中。类似的东西

processData: data
  self
    validateData: data;
    doSomethingWith: data;
    "...blah..."

关于smalltalk - 如何将 block 循环中包含的变量返回到 pharo 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48278974/

相关文章:

observer-pattern - 公告与经典 Smalltalk-80 依赖/更改/更新机制有何关系?

smalltalk - 方法查找器未找到新方法

在 Pharo 中覆盖 <

smalltalk - 子类流

pharo - 如何在 Ubuntu 上为 Pharo 启用鼠标中键?

pharo - Pharo 6.1 中的 "File in"怎么办?

cloud - 我们如何部署 Pharo 海边 Web 应用程序?

smalltalk - 我们如何在不在 Playground 上实例化对象的情况下运行 pharo 程序?

smalltalk - self subclassResponsibility 的使用

smalltalk - whileTrue 在 block 闭包 Smalltalk 中?