Вычисляемые свойства

Классы / Свойства

local Square = {}

function Square.new(side)
  return setmetatable({side = side}, Square)
end

-- Reading a missing field calls __index
function Square.__index(self, key)
  if key == "area" then
    return self.side * self.side
  end
  return Square[key]
end

-- Writing a missing field calls __newindex
function Square.__newindex(self, key, value)
  if key == "area" then
    self.side = math.sqrt(value)
  else
    rawset(self, key, value)
  end
end

local square = Square.new(2)
-- square.area = 4
print("square.area = " .. square.area)

square.area = 9
-- square.side = 3.0
print("square.side = " .. square.side)