Search code examples
lualua-table

Using a variable as arithmetic operator in Lua


I want to use a variable that references an arithmetic operator within an if statement expression as shown below:

str = { '>60', '>60', '>-60', '=0' }
del = 75

function decode_prog(var1, var2)
    op = string.sub(var1, 1, 1)
    vb = tonumber(string.sub(var1, 2, 3))

    if var2 op vb then
        print("condition met")
    else 
        print('condition not meet')
    end
end
for i = 1, #str do
    decode_prog(str[i], del)
end

When the above code executes, it should either print "condition met" or "condition not met" based on the result of the operation, however I am instead receiving an error.


Solution

  • You cannot substitute a native Lua operator with a variable that references a function, the only way to go about what you are attempted to do is to create a set of functions within an associative array and set the index as a reference to the respective operation you want to conduct.

    Looking at your list, you have a greater than (>) and equal to (=). We create a table for these operations that takes two parameters as follows.

    local operators = {
        [">"] = function(x, y) return x > y end,
        ["="] = function(x, y) return x == y end,
        -- Add more operations as required.
    }
    

    You can then invoke the respective function from the decode_prog function by obtaining the operation character from the string, along with the numeric value itself - this is possible because you can obtain the function from the associative array where the index is the string of the operation we want to conduct.

    local result = operators[op](var2, number)
    

    This calls upon the operators array, uses the op to determine which index we need to go to for our appropriate operation, and returns the value.

    Final Code:

    str = { '>60', '>60', '>-60', '=0' }
    del = 75
    
    local operators = {
        [">"] = function(x, y) return x > y end,
        ["="] = function(x, y) return x == y end,
    }
    
    function decode_prog(var1, var2)
        local op = string.sub(var1, 1, 1) -- Fetch the arithmetic operator we intend to use.
        local number = tonumber(string.sub(var1, 2)) -- Strip the operator from the number string and convert the result to a numeric value.
    
        local result = operators[op](var2, number) -- Invoke the respective function from the operators table based on what character we see at position one.
    
        if result then
            print("condition met")
        else 
            print('condition not met')
        end
    end
    
    for i = 1, #str do
        decode_prog(str[i], del)
    end