仅在用户第一次调用块时初始化本地块变量

时间:2014-11-11 12:08:14

标签: smalltalk squeak

有没有办法写一个块(没有得到任何参数),只有在第一次调用时才能执行某些操作。

我想仅在第一次初始化本地块变量,然后每次用户通过以下方式调用该块时更改其值:块值。

我的块将在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

2 个答案:

答案 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]

从技术上讲,第二个示例在块执行之前初始化变量。如果没关系,那就行了。如果您确实希望在第一次调用时初始化变量,请使用第一个示例。