Ccmmutty logo
Commutty IT
1 min read

コルーチンを使ってPromiseぽいことをする小さな例

https://cdn.magicode.io/media/notebox/153a576d-0502-4ca2-8d6e-4847f72288fe.jpeg
できたこと
関数helloの引数にコールバック関数を渡さずに非同期処理を書きました。
免責事項
コルーチンの勉強しています。以下のコードがかけて少し使い所がわかってきた気がしました。ちゃんと勉強していないのでもっとシンプルに書けるかもしれません。
コードの説明
関数coのローカル変数fを書き換えています。
local on = { Event = function(event, callback) end }
local function get_name() end

local function hello()
  local co = function()
    local f = nil
    coroutine.yield(function(f_)
        f = f_
    end)
    coroutine.yield(f)
  end

  -- ドアが開くと実行されます。
  -- よくわからなかったらタイマーで想像してください。
  on.Event("ドアが開く", function()
    local name = get_name()
    local f = co()
    if f ~= nil then
      f(name)
    end
  end)

  return coroutine.wrap(co)
end

local function main()
  local co = hello()
  co()(function(name)
    print("こんにちは" .. name .. "さん")
  end)
end

Discussion

コメントにはログインが必要です。