比较Squeak Smalltalk中的块

The*_*der 4 smalltalk squeak

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

~~~Other code~~~
toRunBlock := [nil].
~~~Other code~~~
Run Code Online (Sandbox Code Playgroud)

但在某些时候,我需要将它与另一个代码块进行比较:

(toRunBlock = [nil]) ifTrue: [
    "Run some code if toRunBlock hasn't been overwritten"
].
Run Code Online (Sandbox Code Playgroud)

但是这个检查总是假的,我找不到办法检查它们是否相等.有人可以帮我解决这个问题吗?

Max*_*ske 6

正如@LeandroCaniglia指出的那样,你不应该比较块.以下是两种在不比较块的情况下解决问题的方法:

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

    toRunBlock
        ^ toRunBlock ifNil: [ [] ]
    
    Run Code Online (Sandbox Code Playgroud)

    现在,当您查看变量时toRunBlock,nil除非#toRunBlock已经发送或通过其他方式设置了块.

    您的代码将变为:

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

    toRunBlock: aBlock
        toRunBlock := aBlock.
        hasToRunBlockBeenSet := true
    
    Run Code Online (Sandbox Code Playgroud)

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

    hasToRunBlockBeenSet
        ^ hasToRunBlockBeenSet ifNil: [ false ]
    
    Run Code Online (Sandbox Code Playgroud)

    您的代码将变为:

    self hasToRunBlockBeenSet ifTrue: [
        "Run some code if toRunBlock hasn't been overwritten"
    ].
    
    Run Code Online (Sandbox Code Playgroud)

第二种方法可以说更可靠.