[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Long chains of objects (aka tables)
- From: Philipp Janda <siffiejoe@...>
- Date: Sun, 18 May 2014 16:00:30 +0200
Am 18.05.2014 06:16 schröbte Andrew Starks:
On Sat, May 17, 2014 at 1:50 PM, Andrew Starks <andrew.starks@trms.com>wrote:
On Saturday, May 17, 2014, Roberto Ierusalimschy <roberto@inf.puc-rio.br>
wrote:
I want something like |local v = t?t1?t2?t3|... (actually I want
|local v = t?.t1?.t2?.t3|...)
Another option:
local v = (((t or E).t1 or E).t2 or E).t3
(where E={} is defined somewhere in your code...)
local a = {b ={c = {d = nil}}}
print(((a.b.c.d or empty).e.f or empty).g )
```
I don't like it as much. Maybe someone has some ideas. Most often I'm
checking to see if something exists or if it does it could be a table.
With this, I'd have to say:
```
local ((a.b.c.d or empty).e.f or empty).g = test_val
if not (test_val == nil or test_val == empty) then
end
What about:
local E = require( "empty" )
local a, x = { b = { c = { d = { e = "ok" } } } }, nil
print( (((a or E[4]).b or E[3]).c.d or E[1]).e ) --> ok
print( (((x or E[4]).b or E[3]).c.d or E[1]).e ) --> nil
print( (((a or E[4]).x or E[3]).c.d or E[1]).e ) --> nil
print( (((a or E[4]).b or E[3]).c.x or E[1]).e ) --> nil
print( (((a or E[4]).b or E[3]).c.d or E[1]).x ) --> nil
I'm not sure that that is all that much pretty or clearer than:
-- check for g, but first check if d as there and it has a valid f.
if a.b.c.d and a.b.c.d.e.f and a.b.c.d.e.f.g then
I'd much prefer:
if a.b.c?d.e?f.g then -- (or the .?)
but that's just me.But it's not a giant pain, either.
What kind of data structures are you guys dealing with? The longest
sequence of fixed length with constant table lookups in my code is
`package.loaded.math`, and even for non-constant table lookups (the
hypothetical `?[var]` syntax) I have found only one place where I could
use this (the length is fixed there because I generate code at runtime
for a particular case) ...
-Andrew
Philipp
local assert = assert
local error = assert( error )
local type = assert( type )
local setmetatable = assert( setmetatable )
local function readonly()
error( "this table is readonly", 2 )
end
local M = { (setmetatable( {}, { __newindex = readonly } )) }
local M_meta = {}
function M_meta:__index( i )
if type( i ) == "number" and i >= 1 and i % 1 == 0 then
local t, meta = {}, { __newindex = readonly }
function meta:__index( k )
return M[ i-1 ]
end
setmetatable( t, meta )
M[ i ] = t
return t
end
end
return setmetatable( M, M_meta )