Reusing coroutines with various call arguments in lua

It was very useful for me to reuse the created one coroutine. I found a solution for this, and it looks like this:

co = coroutine.create(function (f, args)
  while f do
    f = coroutine.yield(f(args))
  end
end)

function dummyFunc(data)
  print("XXX "..data)
  coroutine.yield()
  print("OOO "..data)
end

coroutine.resume(co, dummyFunc, "1")
coroutine.resume(co, dummyFunc, "2")
coroutine.resume(co, dummyFunc, "3")
coroutine.resume(co, dummyFunc, "4")

This works like a charm, except for the output not :

XXX 1
OOO 2
XXX 3
OOO 4

It:

XXX 1
OOO 1
XXX 1
OOO 1

So, is it possible to change the arguments to dummyFuncbetween resume calls?

+4
source share
1 answer

. . resume , , resume, coroutine. coroutine yield s, , yield, resume.

, , resume , , . , .

, resume yield.

co = coroutine.create(function (f, args)
  while f do
    f = coroutine.yield(f(args))
  end
end)

, :

co = coroutine.create(function (f, args)
  while f do
    f, args = coroutine.yield(f(args))
  end
end)

, - , , :

co = coroutine.create(function (...)
  local function capture_args(...)
    return {...}, select("#", ...)
  end

  local tbl, len = capture_args(...)
  local f = tbl[1]

  while f do
    tbl, len = capture_args(coroutine.yield(f(unpack(tbl, 2, len))
    f = tbl[1]
  end
end)

capture_args, {...} unpack . , nil . ... , nil ( ). , , nil.

capture_args, select. unpack , , .

capture_args , . .


: dummyFunc, dummyFunc, , , yield (.. resume).

, dummyFunc . dummyFunc - , dummyFunc, , .

+2

Source: https://habr.com/ru/post/1607795/


All Articles