169 lines
3.0 KiB
Lua
Executable File
169 lines
3.0 KiB
Lua
Executable File
-- shared_meters = true
|
|
|
|
keep_ambiguous = true
|
|
|
|
require 'unclasslib'
|
|
|
|
function say(msg) print(msg and "> " .. msg or "") end
|
|
|
|
print [[
|
|
> meter = class()
|
|
> function meter:__init(value)
|
|
> print("meter init " .. (value or 'nil'))
|
|
> self.value = value or 0
|
|
> end
|
|
> function meter:set(value)
|
|
> self.value = value
|
|
> end
|
|
> function meter:read()
|
|
> print("meter read " .. self.value)
|
|
> return self.value
|
|
> end
|
|
> function meter:which()
|
|
> print("meter = " .. tostring(self) .. " { value = " .. self.value .. " }")
|
|
> end
|
|
> meter.value = -1
|
|
]]
|
|
|
|
meter = class()
|
|
function meter:__init(value)
|
|
print("meter init " .. (value or 'nil'))
|
|
self.value = value or 0
|
|
end
|
|
function meter:set(value)
|
|
self.value = value
|
|
end
|
|
function meter:read()
|
|
print("meter read " .. self.value)
|
|
return self.value
|
|
end
|
|
function meter:which()
|
|
print("meter = " .. tostring(self) .. " { value = " .. self.value .. " }")
|
|
end
|
|
meter.value = -1
|
|
|
|
m = shared_meters and shared(meter) or meter
|
|
mm = shared_meters and "shared(meter)" or "meter"
|
|
|
|
say("hygro = class(" .. mm .. ")")
|
|
hygro = class(m)
|
|
|
|
print [[
|
|
> function hygro:read()
|
|
> print("humidity " .. self[meter].value)
|
|
> end
|
|
]]
|
|
|
|
function hygro:read()
|
|
print("humidity " .. self[meter].value)
|
|
end
|
|
|
|
say("therm = class(" .. mm .. ")")
|
|
therm = class(m)
|
|
|
|
print [[
|
|
> function therm:read()
|
|
> print("temperature " .. self[meter].value)
|
|
> end
|
|
]]
|
|
|
|
function therm:read()
|
|
print("temperature " .. self[meter].value)
|
|
end
|
|
|
|
print [[
|
|
> hygrotherm = class(hygro, therm)
|
|
> function hygrotherm:read()
|
|
> self[hygro]:read()
|
|
> self[therm]:read()
|
|
> end
|
|
]]
|
|
|
|
hygrotherm = class(hygro, therm)
|
|
function hygrotherm:read()
|
|
self[hygro]:read()
|
|
self[therm]:read()
|
|
end
|
|
|
|
say('ht = hygrotherm(0)')
|
|
ht = hygrotherm(0)
|
|
|
|
say()
|
|
say("ht[therm]:set(11)")
|
|
|
|
ht[therm]:set(11)
|
|
|
|
say("ht[therm]:read()")
|
|
|
|
ht[therm]:read()
|
|
|
|
say()
|
|
say("ht[hygro]:set(22)")
|
|
|
|
ht[hygro]:set(22)
|
|
|
|
say("ht[hygro]:read()")
|
|
|
|
ht[hygro]:read()
|
|
|
|
say()
|
|
say("ht[therm]:read()")
|
|
|
|
ht[therm]:read()
|
|
|
|
say()
|
|
say("ht:read()")
|
|
|
|
ht:read()
|
|
|
|
say()
|
|
say("ht:which()")
|
|
|
|
status, msg = pcall(ht.which, ht)
|
|
if not status then print(msg) end
|
|
|
|
function show(t)
|
|
if not t or not t.__type then print("Sorry, cannot show " .. tostring(t)) return end
|
|
print('__type', t.__type)
|
|
for i, v in pairs(t) do
|
|
if type(i) ~= 'string' or i:sub(1, 2) ~= '__' then print(i, v) end
|
|
end
|
|
end
|
|
|
|
print()
|
|
print("Class attributes:")
|
|
print()
|
|
print('meter:') show(meter)
|
|
print()
|
|
print('therm:') show(therm)
|
|
print()
|
|
print('hygro:') show(hygro)
|
|
print()
|
|
print('hygrotherm:') show(hygrotherm)
|
|
print()
|
|
print("ht is a meter = ", ht:is_a(meter))
|
|
print("ht is a therm = ", ht:is_a(therm))
|
|
print("ht is a hygro = ", ht:is_a(hygro))
|
|
print("ht is a hygrotherm = ", ht:is_a(hygrotherm))
|
|
|
|
|
|
print()
|
|
print("Object attributes:")
|
|
print()
|
|
print("ht:") show(ht)
|
|
print()
|
|
print("ht[hygro]:") show(ht[hygro])
|
|
print()
|
|
print("ht[therm]:") show(ht[therm])
|
|
print()
|
|
print("ht[hygro][meter]:") show(ht[hygro][meter])
|
|
print()
|
|
print("ht[therm][meter]:") show(ht[therm][meter])
|
|
print()
|
|
print("ht[meter]:")
|
|
|
|
status, msg = pcall(show, ht[meter])
|
|
if not status then print(msg)end
|
|
|
|
|