First off, your example wouldn’t work even without a copy. a:c prints self.b, not return it. The print function does not return anything.
Here’s something you could do, though:
function a:Clone()
local new = {}
for key, value in pairs(self) do
new[key] = value
end
setmetatable(new, getmetatable(self))
return new
end
That makes a shallow copy, not a deep copy (only the first “layer” of keys/values are copied, and the value will still point to the same references from the values of the old table)