With default parameter values

Classes / Constructors

local Man = {}
Man.__index = Man

-- No overloads: a skipped argument is nil,
-- and or supplies the default
function Man.new(name, country)
  return setmetatable({
    name = name or "unknown",
    country = country or "unknown",
  }, Man)
end

local man1 = Man.new()
-- man1.name = unknown
-- man1.country = unknown

local man2 = Man.new("Vladimir")
-- man2.name = Vladimir
-- man2.country = unknown

-- Arguments are positional: nil skips one
local man3 = Man.new(nil, "Brazil")
-- man3.name = unknown
-- man3.country = Brazil

local man4 = Man.new("Vladimir", "Brazil")
-- man4.name = Vladimir
-- man4.country = Brazil

print("man1.name = " .. man1.name)
print("man1.country = " .. man1.country)
print("man2.name = " .. man2.name)
print("man2.country = " .. man2.country)
print("man3.name = " .. man3.name)
print("man3.country = " .. man3.country)
print("man4.name = " .. man4.name)
print("man4.country = " .. man4.country)