2018年12月10日月曜日

S{}ってなんだ!?

findAll.luaをちょっとだけ読んでみたんだけど、65行目でもうわからないw
    local variable_cache = S{}
なんだこれ。。。
Luaにこんな文法があるのかと一生懸命WEB検索してもわからないw




結論からいうと、findAll.luaの37行目の
require('sets')

これが「S{}」を読み解くカギでした。requireで呼び出しているsets.luaWindower4\addons\libs\sets.luaのこと。その中で
function S(t)
    t = t or {}
    if class(t) == 'Set' then
        return t
    end
    local s = {}
    if class(t) == 'List' then
        for _, val in ipairs(t) do
            s[val] = true
        end
    else
        for _, val in pairs(t) do
            s[val] = true
        end
    end
    return setmetatable(s, _meta.S)
end

このように「S」が定義されてます。つまり「S」は関数名でした。

そして、

   local variable_cache = S{}

というのは

   local variable_cache = S({})

の省略形です。関数にテーブルを1つだけ渡す場合、括弧()を省略できるというLuaのルールがあるそうです。

そして、このSには+とか-とかの演算子がsets.luaの中で定義されていて、集合(sets)どうしの足し算とか引き算とかができるようになっているというわけですね。

イメージ的には、こんなかんじ。

   S{1,2,3}+S{4,5,6} → S{1,2,3,4,5,6}


集合Sと同じようにテーブルTもwindower4\addons\lib\tables.luaのなかで定義されています。
詳しくは下記URLを。

https://github.com/Windower/Lua/wiki/Writing-Addons#tables

0 件のコメント:

コメントを投稿