Проблема с функцией, а точнее с аргументами

-- Анонимная функция
local add = function(a, b)
    return a + b
end

-- Передача функции в качестве аргумента
local function apply(func, x)
    return func(x)
end

print(apply(add, 3))

Можете помочь исправить?

lua: main.lua:3: attempt to perform arithmetic on a nil value (local 'b')
stack traceback:
        main.lua:3: in function <main.lua:2>
        (...tail calls...)
        main.lua:11: in main chunk
        [C]: in ?

Ответы (1 шт):

Автор решения: Alexander Mashin

Функция add (a, b) требует двух аргументов. Внутри функции apply (func, x) передаётся только один.

Не вполне ясно, чего именно Вы хотели достичь. Вот два работающих варианта. В первом используется вариативная функция:

-- Передача функции в качестве аргумента
local function apply (func, ...) -- вариативная функция.
    return func (...) -- передача всех аргументов далее.
end

print (apply (function (a, b) -- это действительно анонимная функция.
    return a + b
end, 3, 4 --[[а это два требуемых ею аргумента]] ))

Во втором примере используется замыкание:

local function add_this_much (add_this)
    return function (add_to) -- замыкание, получающее один аргумент.
        return add_to + add_this
    end
end

local add_three = add_this_much (3) -- получается функция, получающая один аргумент.

print (add_three (4))
→ Ссылка