lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Am 24.03.2018 um 07:06 schröbte Sergey Zakharchenko:
Philipp,

Hi!


When using the `pairs` function, I expect getting pairs. An iterator
factory for keys only would better be called `keys()`. Implementation-wise
it could look for a `__keys` metamethod for those performance critical
cases and fall back to the `pairs` protocol but dropping the second value.

Not sure we should introduce a separate metamethod for that, would be nice
to check memory usage/processing overhead in these cases. BTW while we're
discussing all of this, pairs() seems to pass only 1 argument to __pairs,
but I didn't suggest changing *that*.

Not sure I can follow the second part. I thought about something like

    do
      local function firstonly( f, ... )
        return function( s, var )
          return (f( s, var ))
        end, ...
      end

      function keys( obj )
        local mt = getmetatable( obj )
        if type( mt ) == "table" and
           type( mt.__keys ) == "function" then
          return mt.__keys( obj )
        else
          return firstonly( pairs( obj ) )
        end
      end
    end

which reuses the `pairs` protocol as is but only returns the keys.

I agree on the first part though. It seems that in other languages you would look for some method to call while in Lua we use a metamethod instead if we want customized behavior.


Best regards,


Philipp