Lua - Function with Optional Parameters



In Lua, there is no direct support for optional parameters and named parameters in functions definition. But we've seen how to implement named parameters in Named Arguments chapter. In this chapter, we'll showcase how to add support for optional parameters and how to add default values to the parameters in case parameters are not passed to a function.

Adding Support for Optional Parameter

Let's revisit the example used in Named Arguments chapter. We've created a table named as shapeDetails and passed the same to the function as shown below −

main.lua

-- function to calculate area of a shape passed
function calculate(shapeDetails)
   return shapeDetails.length * shapeDetails.width
end

shapeDetails = {type='Rect', length=2, width=4}

-- calculate area of rectangle
print('Area of Rectangle', calculate(shapeDetails))

Output

When we run the above code, we will get the following output−

Area of Rectangle	8

Now suppose, we want to add hight details of shape as well but keeep it optional. That's easy to handle now as a part of table.

shapeDetails = {type='Cuboid', length=2, width=4, height=10}

Handle the same in function as shown in code below−

function calculate(shapeDetails)
    if shapeDetails.height then
	   return length * width * height
	else
	   return length * breadth
	end
end

Complete Example of Optional Parameter

Now specify length, width to function in one call and all three parameters in second call and verify the result.

main.lua

-- function to calculate area or volume of a shape passed
function calculate(shapeDetails)
   if shapeDetails.height then
      return shapeDetails.length * shapeDetails.width * shapeDetails.height
   else
      return shapeDetails.length * shapeDetails.width
   end
end

shapeDetails = {length=2, width=4}

-- calculate area of rectangle
print('Area of Rectangle', calculate(shapeDetails))

shapeDetails = {length=2, width=4, height=10}

-- calculate volume of cuboid
print('Volume of Cuboid', calculate(shapeDetails))

Output

When we run the above code, we will get the following output−

Area of Rectangle	8
Volume of Cuboid	80

Default parameter Implementation

In similar way as we've defined optional parameter, we can set default value(s) to optional parameter(s) as shown in example below−

main.lua

-- function to calculate volume of a shape passed
function calculate(shapeDetails)
   local length = shapeDetails.length
   local width = shapeDetails.width
   local height = 1  -- default value of height

   -- if height is provided, then use the provided one   
   if shapeDetails.height then 
      height = shapeDetails.height
   end	  

   local area = length * width
   local volume = length * width * height
   
   return area, volume
end

shapeDetails = {length=2, width=4}

-- calculate area and volume(using default height)
area, volume = calculate(shapeDetails)
-- print area and volume
print(area, volume)

-- add height to the shape
shapeDetails.height=10

-- calculate area and volume(using provided height)
area, volume = calculate(shapeDetails)
-- print area and volume
print(area, volume)

Output

When we run the above code, we will get the following output−

8	8
8	80
Advertisements