Smalltalk 块 - 我可以显式设置返回值并停止执行该块吗?

2023-12-19

#value: 消息发送到块时的返回值是该块中最后一句的值。所以[ 1 + 2. 3 + 4. ] value评估为7。 我发现有时很难使用。有没有办法显式设置返回值并停止执行块?

作为练习,尝试在不使用我想象的 #return: 消息的情况下重写此块,看看它会变得多么难看。我肯定错过了什么。

[ :one :two |
  one isNil ifTrue: [ two isNil ifTrue: [ self return: nil ] ifFalse: [ self return: true ] ].
  two ifNil: [ self return: false ].

 (one > two)
  ifTrue: [ self return: true ]
  ifFalse: [ (one < two)
              ifTrue: [ self return: false ]
              ifFalse: [ self return: nil ]
            ].
]

EDIT: self return: sth确实是废话,但确实有道理some等级 :)


没有什么比保护条款更好的了 -blah ifTrue: [^ foo]- 在一个块内,因为^是非本地返回,从调用块的方法而不是块本身返回。

大块——就像大的东西一样——应该被重构为更小、更容易理解/易于处理的子部分,但有时这并不总是可能的。我的意思是这个答案是建议您尝试的选项can't确实以通常的方式简化。

如果您的块确实那么复杂,并且您无法使其变得更简单(例如,将其拆分会使信息过多地离域),那么也许您可以使用显式返回值。特别是,如果你的块没有返回nil你可以做类似的事情

[:one :two | | result |
    result := (one isNil and: [two isNil]) ifTrue: [false].
    result ifNil: ["do one thing, possibly setting result"].
    result]

如果你的区块可以返回nil,您将需要另一个哨兵值:

[:one :two | | result marker |
    result := marker := Object new.
    (result == marker) ifTrue: ["do one thing, possibly setting result"].
    result]

最后 - 我犹豫是否建议这样做 - 你可以这样做:

[1 + 2.
thisContext return: 5.
3 + 4] value

返回5.

(验证它如何与^和内联选择器,例如#ifTrue:ifFalse:留给读者作为练习。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Smalltalk 块 - 我可以显式设置返回值并停止执行该块吗? 的相关文章

  • 如何在 html.erb 文件中运行多行 Ruby

    我正在使用 Ruby on Rails 需要在我的 html erb 文件之一中运行一段 Ruby 代码 我这样做吗 或者像这样 谢谢阅读 如果您的视图中需要额外的函数 通常您可以在助手中声明它们 对于每个控制器 如果有助手 它会自动加载
  • Rust:如何逐块读取文件

    我对生锈完全陌生 我想逐块 块读取文件 每个块应包含 16 个字节 并将其 对于此测试场景 写入另一个文件 f2 所以我首先在这里尝试使用以下代码 let mut buf 0 16 let mut count 0 for byte in f
  • 如何向用户询问文件名?

    搜索 FileDialog 的调用 我想向用户询问 Pharo 4 0 中的文件名 通过观察员我找到了班级 FileDialogWindow 用一种方法 answerFileName 寻找 answerFileName 的发件人 我去上课
  • 数据注释或应用程序验证块

    DataAnnotations 和应用程序验证块有什么区别 DataAnnotations 是一个基于属性的模型 用于 注释 数据 它位于 NET 框架本身中 它最明显的用途是验证 例如 ASP NET MVC 所做的那样 Validati
  • 如何从 Pharo 中的调试器复制堆栈跟踪?

    如何从 Pharo 中的调试器复制堆栈跟踪 我知道图像附近有 Debug log 文件 但我太懒了 无法从 Pharo 导航到文件系统 找到文件夹 并浏览一个巨大的文本文件 如果前面有堆栈跟踪 我的 我知道一个方法 但不是最好的 当您在调试
  • ruby 中的块作用域

    我的理解是 ruby 块具有块作用域 并且在块内创建的所有变量将仅存在于该块内 案例示例 food toast cheese wine food each food puts food capitalize puts food Output
  • Squeak/Pharo Web 服务的微框架

    许多语言都有用于编写非常小的网站或 Web 服务的微框架 例如用于 Python 的 Flask 或用于 Ruby 的 Sinatra 在 Squeak 上 似乎没有任何类似的东西 伊利亚特 海边 和 AIDA 都非常重 只是提供了一点服务
  • PostgreSQL:块中的页眉无效

    我收到错误 ERROR invalid page header in block 411 of relation t value time 在我的 PostgreSQL 数据库中 这种情况在不同的机器上不断发生 有没有办法防止这种情况发生
  • Rails 的 concat 方法和 do...end 块不起作用

    我刚刚读到 Rails 的concat清理在这里输出内容的助手的方法http thepugautomatic com 2013 06 helpers http thepugautomatic com 2013 06 helpers 我尝试了
  • 非静态初始化块的替代方案是什么?

    我的项目有一些开发人员喜欢非静态初始化块 是什么选择对此 什么是downside这个替代方案 我猜想 初始化中的值构造函数 为什么我们应该使用非初始化块 首先 在那里将 test 初始化为 new String 是没有意义的 因为初始化块立
  • 如何在 Seaside 回调中访问 jQuery 事件对象

    基本上 我想将以下内容翻译成 Seaside Smalltalk myDiv bind click function e console log e 除此之外我不想console log事件 但在我的 ajax 回调中访问它 最有希望的方法
  • 在 Smalltalk 实现中测试 Unicode 支持的正确方法是什么?

    考虑到任何 Smalltalk 风格 我应该如何继续检查 Unicode 是否受支持 如果没有支持 我如何检测缺少哪个级别 VM 字体 转换器等 在VM级别你可以尝试Character codePoint 256 or Character
  • 使用 swift 验证 GameKit 本地玩家

    我希望将游戏迁移到 swift 我遇到的唯一麻烦是块 关闭 这是我不明白的语法 而在 Objective C 中我会使用 GKLocalPlayer localPlayer GKLocalPlayer localPlayer localPl
  • 使用 Open Graph API 阻止用户

    是否可以使用开放图谱 API 阻止 Facebook 上的用户 我不想阻止用户使用应用程序 但希望允许用户在我的应用程序中阻止 Facebook 好友 如果他们愿意 这与访问 Facebook com 并阻止用户一样 从而将他们隐藏在您的所
  • 是否可以在 proc 中查看 ruby​​ 代码?

    p Proc new puts ok 是否可以在过程中看到 ruby 代码 inspect返回内存位置 puts p inspect
  • 使用 OCMock 以代码块作为参数的存根方法

    有没有一种方法可以存根方法 以块作为参数 例如方法 void reverseGeocodeLocation CLLocation location completionHandler CLGeocodeCompletionHandler c
  • 在 Smalltalk/Pharo 中创建以块作为参数的键值消息

    我有一个场景 一个类拥有两个互斥的实例变量 即一次只能实例化一个 准确地说 我有一个 Promise 类 尝试将 Promise 添加到 Pharo 它包含 PromiseError 和 PromiseValue 实例变量 然后我想实现 t
  • Smalltalk 中的简单类定义错误

    我正在尝试使用smalltalkSmalltalk x jv 分支 https swing fit cvut cz projects stx jv 我有以下简单的代码 Object subclass Myclass mainval init
  • Morphic 中的 Morph 和 Cocoa 中的 NSView 有什么区别?

    我想了解 Morphic 的独特之处 Morphic 比 NSView 或任何其他graphics类只允许重新实现一组有限的功能 Morphic 是一个可塑性极强的 UI 构建工具包 Morphic 背后的一些设计理念明确了这一意图 包括一
  • 了解如何 printf("%d\n", ( { int n; scanf("%d", &n); n*n; } ));在 C 语言中工作

    我通过一个途径发现了这个程序 include

随机推荐