有没有办法写一个块(没有得到任何参数),只有在第一次调用时才能执行某些操作。
我想仅在第一次初始化本地块变量,然后每次用户通过以下方式调用该块时更改其值:块值。
我的块将在B类中的方法A中定义。 并且该方法返回块。
所以每次调用方法A时都应该进行初始化。但每当我打电话给那个街区时,它应该从同一点继续。
例如:我希望我被初始化为0.
A
^[i:=i+1]
ob1 = B new.
res= obj1 A.
Transcript show: res value. // should print 1
Transcript show: res value. // should print 2
res2= obj1 A.
Transcript show: res2 value. // should print 1
答案 0 :(得分:2)
您可以使用块的外部上下文来执行此操作:
MyClass>>myBlock
| init |
init := false.
^ [init
ifTrue: [1]
ifFalse: [
init := true.
2]].
这为第一次和第二次访问块提供了不同的结果:
| block |
block := MyClass new myBlock
{ block value . block value } "=> #( 2 1 )"
答案 1 :(得分:2)
这是您修改过的代码段。
A
| first |
first := true.
^[first ifTrue: [i := 0. first := false].
i := i+1]
或更简单:
A
| i |
i := 0.
^[i := i+1]
从技术上讲,第二个示例在块执行之前初始化变量。如果没关系,那就行了。如果您确实希望在第一次调用时初始化变量,请使用第一个示例。