Это не совсем тернарный оператор, а именно комбинация and и or.
Выражение: A and B or C
аналогично тернарному оператору (которого в Lua нет), только если B истинно.
(доказательство)
Для начала вспомним некоторые правила синтаксиса Lua:
and возвращает первый операнд, если он ложный, иначе второй.
or возвращает первый операнд, если он истинный, иначе второй.
and имеет выше приоритет (т.е. выполняется первым).
Ложными в Lua являются только false и nil
Теперь построим таблицу истинности результатов:
Поэтому решение такое: local res = ((i ~= k) and 2 or nil)