[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: Why don't pairs() and ipairs() obey an __index metamethod?
- From: David Haley <dchaley@...>
- Date: Thu, 20 Sep 2007 20:15:05 -0700
On this day of 09/19/07 20:38, Duck saw fit to scribe:
> The manual simply says that "the construction
> for k,v in pairs(t) do _body_ end
> will iterate over all key-value pairs of table t."
> Whilst might been seem as implying that only k-v pairs actually in table t
> will be returned (i.e. no metamethods pursued), it doesn't explicitly say
> so (perhaps it should?).
I think it has to do with how you conceive of the 'index' operation. An
index metamethod isn't adding keys to a table: it's a trap used to
handle a key not existing in the table. As such, when pairs/ipairs
traverse the table, they only touch keys that are actually present.
> So my question is: why do pairs and ipairs (and, by implication, next)
> behave this way?
One reason might be that it would be confusing if pairs iterated over
keys that were in fact present and keys that are present in the __index
table of the metatable, but it didn't iterate over keys that were
handled by an __index function. Of course, pairs has no way of knowing
which keys an __index function might handle. But then you have a
situation where 'metakeys' (if I may) are handled in some cases but not
others. So to answer your question, it might be in part to avoid this
kind of undesirable situation.