smalltalk - 比较 Squeak Smalltalk 中的 block

标签 smalltalk squeak

我正在squeak编程,需要比较两个代码块如下:(toRunBlock是一个实例变量)

~~~Other code~~~
toRunBlock := [nil].
~~~Other code~~~

但在某些时候,我需要将它与另一个代码块进行比较:
(toRunBlock = [nil]) ifTrue: [
    "Run some code if toRunBlock hasn't been overwritten"
].

但是那个检查总是给出错误的,我找不到检查它们是否相等的方法。有人可以帮我解决这个问题吗?

最佳答案

正如@LeandroCaniglia 指出的那样,您不必比较 block 。以下是在不比较 block 的情况下解决问题的两种方法:


  • 将变量初始化为 nil .在您的访问器方法中,您懒惰地初始化它:

    toRunBlock
        ^ toRunBlock ifNil: [ [] ]
    

    现在,当您查看变量 toRunBlock它将是 nil除非#toRunBlock已发送或已通过其他方式设置的 block 。

    您的代码将变为:

    toRunBlock ifNil: [
        "Run some code if toRunBlock hasn't been overwritten"
    ].
    
  • 通过设置您可以检查的实例变量来使用其他状态。这可能是您的 setter 方法,例如:

    toRunBlock: aBlock
        toRunBlock := aBlock.
        hasToRunBlockBeenSet := true
    

    并检查你可以使用这样的方法:

    hasToRunBlockBeenSet
        ^ hasToRunBlockBeenSet ifNil: [ false ]
    

    您的代码将变为:

    self hasToRunBlockBeenSet ifTrue: [
        "Run some code if toRunBlock hasn't been overwritten"
    ].
    

  • 第二种方法可以说更可靠。

    关于smalltalk - 比较 Squeak Smalltalk 中的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37845369/

    相关文章:

    smalltalk - 在smalltalk中实现new with argument

    smalltalk - Squeak Smalltalk 阵列中的奇怪行为

    smalltalk - 如何在 Squeak 中撤消 > 1

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

    string - Smalltalk,如何在字符串中插入制表符

    programming-languages - Self 语言是否在计算机研究界之外得到了使用?

    Smalltalk如何用随机数填充二维数组?

    smalltalk - 在 Seaside 等 Web 应用程序框架中处理 Excel 文件

    pharo - 类浏览器中图标的含义

    code-generation - 如何为 Pharo 或 Squeak 中的类自动生成 getter/setter 代码?