执行功能直到谓词满足

时间:2014-05-20 19:11:46

标签: coffeescript

我正在尝试编写一个调用函数doAndRepeatUntil的函数f,直到谓词/条件pred为真。

在下面的代码中,我希望@sum从0开始,然后打印10, 20, ..., 90, 100然后终止。

doAndRepeatUntil = (f, pred) ->
  console.log @sum
  f() until pred()

@sum = 0

f = ->
  @sum += 10

pred = ->
  @sum >= 100

console.log f() # NaN

doAndRepeatUntil(f, pred) # infinite loop

但是,我看到f()打印出NaN。并且doAndRepeatUntil(f,pred)在无限循环中旋转。

1 个答案:

答案 0 :(得分:3)

正如mu is too short在其评论中暗示的那样,@sum在每个函数中都有不同的this上下文。如果情况允许,我会在函数之前定义sum,以便它们适用于所有函数(jsfiddle)。

sum = 0

doAndRepeatUntil = (f, pred) ->
  console.log sum
  f() until pred()

f = ->
  console.log 'f', sum
  sum += 10

pred = ->
  console.log 'pred', sum
  sum >= 100

doAndRepeatUntil f, pred # infinite loop

如果您确实需要保留@sum,那么您需要在函数(jsfiddle)上使用粗箭头。

@sum = 0

doAndRepeatUntil = (f, pred) =>
  console.log @sum
  f() until pred()

f = =>
  console.log 'f', @sum
  @sum += 10

pred = =>
  console.log 'pred', @sum
  @sum >= 100

doAndRepeatUntil f, pred # infinite loop