[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: vararg, table and nil - again
- From: PA <petite.abeille@...>
- Date: Thu, 28 Jun 2007 21:31:43 +0200
Hello,
I guess I'm still completely confused about how to deal with vararg, 
table and nil values...
(1) vararg can have nil values
function dwim( ... )
    print( '#', select( '#', ... ) )
    for anIndex = 1, select( '#', ... ) do
        print( select( anIndex, ... ) )
    end
end
dwim( nil, true )
> 2
> 1       nil     true
> 2       true
2 arguments, the first is nil, the second is true
(2) table behavior seems to be, errr, confusing when confronted with 
nil values
local aTable = { nil, true }
print( #aTable )
> 2
-- Hmmm... two keys...
print( table.maxn( aTable ) )
> 2
-- table.maxn agrees, two keys
print( table.getn( aTable ) )
> 2
-- Even table.getn seems to agree, two keys
for aKey, aValue in pairs( aTable ) do
    print( aKey, aValue )
end
> 2       true
-- The pairs iterator seems to think there is only one key though
for aKey, aValue in ipairs( aTable ) do
    print( aKey, aValue )
end
-- And ipairs doesn't see any keys at all
This is all good and well, if slightly confusing... that said... how 
does one build a vararg at runtime considering all this?!?
For example, lets assume I have a function which would like to strip 
empty strings and replace them with, err, nil values, e.g.:
local function Argument( ... )
    local someArguments = {}
    for anIndex = 1, select( '#', ... ) - 1 do
        local aValue = select( anIndex, ... )
        if aValue:len() == 0 then
            aValue = nil
        end
        someArguments[ #someArguments + 1 ] = aValue
    end
    return someArguments
end
Lets assume this is used to cleanup the captures returned by 
string.match:
local someArguments = Argument( aValue:match( aPattern ) )
And then unpacked as a vararg to invoke a function:
aHandler( unpack( someArguments ) )
This is all good and well except that I cannot seem to find a way to 
'round trip' those vararg properly as a table doesn't support nil 
values in the first place... but vararg does... in other words... how 
does one build a proper vararg at runtime with nil values and all which 
is unpack friendly?!?!?
Any insight much appreciated!
Cheers,
PA.