Hacker News new | ask | show | jobs
by wruza 3499 days ago
If you want, you can add t.exists[key]=true, and check it if you really want to know if key exists despite it's value is nil.

    function exists(t, k)
        return t[k] ~= nil or t.exists[k]
    end
    
    t = { 1, 2, nil, 4, exists={ [3]=true } }
    i = math.random(4)
    if exists(t, i) then
        ...
That's pretty close to Perl's semantics, where undef is inoperable under 'use strict' but arrays/hashes can have them explicit. Also can move exists out of t easily with weak table.

    local exists_t = setmetatable({ }, { __mode='k' })

    function set_exists(t, k)
        exists_t[t] = exists_t[t] or { }
        exists_t[t][k] = true
    end
    
    function exists(t, k)
        return t[k] ~= nil or exists_t[t][k]
    end
That said, I really like math-like attitude of definitions in Lua. No bs like 'bloated for your convenience', you just use your logic skills to program.