lua-users home
lua-l archive

Re: metamethods... are __gt and __ge missing ?

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


Am 22.09.2013 14:10 schröbte Jayanth Acharya:
So, if I understand this correctly, I cannot use the < and <= operators in
Lua code while comparing 2 tables say 'a' and 'b', where the intent was to
check (a < b). However I could rewrite the Lua code as (b > a). Right ?
If so, then this is semantically correct, but makes the code less readable,
no ?
 _________________________________________
 | you have | you write | Lua uses |
 |-------------|-----------|--------------|
 | __lt only | a < b | a < b |
 | __lt only | a <= b | not (b < a) |
 | __lt only | a > b | b < a |
 | __lt only | a >= b | not (a < b) |
 | __lt + __le | a < b | a < b |
 | __lt + __le | a <= b | a <= b |
 | __lt + __le | a > b | b < a |
 | __lt + __le | a >= b | b <= a |
 | __le only | a < b | #error# |
 | __le only | a <= b | a <= b |
 | __le only | a > b | #error# |
 | __le only | a >= b | b <= a |
 ------------------------------------------
HTH,
Philipp
#!/usr/bin/lua
local meta = {}
local function lt( a, b )
 print( "LT", a[ 1 ], b[ 1 ] )
 return a[ 2 ] < b[ 2 ]
end
local function le( a, b )
 print( "LE", a[ 1 ], b[ 1 ] )
 return a[ 2 ] <= b[ 2 ]
end
local a = setmetatable( { "a", 1 }, meta )
local b = setmetatable( { "b", 2 }, meta )
local function try( f )
 if not pcall( f ) then print( "#error#" ) end
end
function test()
 try( function() return a < b end )
 try( function() return a <= b end )
 try( function() return a > b end )
 try( function() return a >= b end )
end
meta.__lt = lt
test()
meta.__le = le
test()
meta.__lt = nil
test()

AltStyle によって変換されたページ (->オリジナル) /