gpt4 book ai didi

smalltalk - 比较 Squeak Smalltalk 中的 block

转载 作者:行者123 更新时间:2023-12-04 22:57:47 24 4
gpt4 key购买 nike

我正在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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com