Как пропустить необязательные параметры в Lua? - PullRequest
3 голосов
/ 20 августа 2011

Есть метод, который я вызывал:

t1, t2 = LSL:GetDiffItem(item)

, где метод объявлен как:

GetDiffID(item, ignoreEnchant, ignoreGem, red, yellow, blue, meta, ignorePris)

Теперь я хочу передать дополнительные параметры, пропуская некоторые:

item , ignoreEnchant , ignoreGem , red , yellow , blue , meta , ignorePris

Я пытался просто пропуск параметров:

t1, t2 = LSL:GetDiffItem(item, ignore, ignore, , , , , ignore)

Но, конечно, это нене работает:

неожиданный символ рядом с ','

Итак, как мне пропустить дополнительные параметры в Lua?


См. Также

Ответы [ 4 ]

6 голосов
/ 20 августа 2011

Pass nil.Это будет идентично тому, что параметр никогда не передавался.Однако следует помнить, что в документации указано, что вы можете сделать это, поскольку большинство функций не проверяют каждый отдельный необязательный параметр, а проверяют каждый параметр, только если был указан предыдущий.

0 голосов
/ 17 марта 2015

Вы можете использовать Именованные аргументы .Как сказано на lua.org: «Этот стиль передачи параметров особенно полезен, когда функция имеет много параметров, и большинство из них являются необязательными».

Идея состоит в том, чтобы передать все аргументы в виде таблицы:

function InfoItem(item)
  if item.name then
    print("Name: ",item.name)
  end
  if item.color then
    print("Color: ",item.color)
  end
  if item.enchant then
    print("Enchant: ",item.enchant)
  end
  if item.specialInfo then
    print(item.specialInfo)
  end
end

InfoItem{name = "Internet Troll's Bane", color = "silver"}
InfoItem{name = "Death's Toenail Clipper", enchant = "unbreakable", specialInfo = "Little effort required to cut through the thickest nails."}
0 голосов
/ 21 августа 2011

Использование nil.

обратите внимание, что это не сработает, когда код C использует gettop или полагается на 'NONE', например, в типе switch / case, или проверяет explicity на отсутствие или ноль вместо lua_isnoneornil.

0 голосов
/ 20 августа 2011

Если вы пишете свои собственные функции (вместо того, чтобы использовать ранее существующий API), я использовал метод, чтобы передать таблицу в качестве единственного параметра функции и заполнить соответствующие значения в этой таблице. Назначение метатаблицы со значениями по умолчанию в качестве первого шага в вашей функции позволяет избежать просмотра значений по умолчанию на каждом шаге, но убедитесь, что пользователи знают, что вы перезаписываете метатаблицы на их входах.

...