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