Нет, не в пределах стандартного Lua. И, как говорит Аарон Саарела, это несколько выходит за рамки духа Луа, насколько я понимаю. Способ Lua состоит в том, чтобы убедиться, что сама функция рассматривает nil
как разумное значение по умолчанию (или преобразует его в разумное значение по умолчанию с чем-то вроде name = name or "Bruce"
перед первым использованием), или если нет разумного значения по умолчанию, функция должна либо выдает ошибку или возвращает ошибку (if not name then error"Name required" end
является распространенной идиомой для первой, а if not name then return nil, "name required" end
является распространенной идиомой для последней). Взяв на себя ответственность Lua за свои собственные проверки аргументов, вы получаете это преимущество независимо от того, вызывается ли функция из Lua или C.
Тем не менее, вполне возможно, что ваши модули могут поддерживать таблицу атрибутов, проиндексированную функцией, которая содержит информацию, которую вы должны знать. Это потребовало бы обслуживания, конечно. Также возможно, что MetaLua можно использовать для добавления некоторого синтаксического сахара для создания таблицы непосредственно из объявлений функций во время компиляции. Перед вызовом функции Lua вы должны использовать ее напрямую для поиска любых доступных атрибутов и использовать их для проверки вызова.
Если вы беспокоитесь о пуленепробиваемости, вы можете захотеть контролировать функциональную среду, чтобы проявлять осторожность с тем, какие (если таковые имеются) глобальные переменные доступны стороне Lua, и использовать lua_pcall()
вместо lua_call()
, чтобы вы ловите любые сгенерированные ошибки.