171 lines
2.9 KiB
Lua
Executable File

shared_meters = true
keep_ambiguous = true
require 'classlib'
function say(msg) print(msg and "> " .. msg or "") end
print [[
> class.meter()
> 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
]]
class.meter()
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("class.hygro(" .. mm .. ")")
class.hygro(m)
print [[
> function hygro:read()
> print("humidity " .. self.meter.value)
> end
]]
function hygro:read()
print("humidity " .. self.meter.value)
end
say("class.therm(" .. mm .. ")")
class.therm(m)
print [[
> function therm:read()
> print("temperature " .. self.meter.value)
> end
]]
function therm:read()
print("temperature " .. self.meter.value)
end
print [[
> class.hygrotherm(hygro, therm)
> function hygrotherm:read()
> self.hygro:read()
> self.therm:read()
> end
]]
class.hygrotherm(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