Lua: Как установить переменную на ноль - PullRequest
2 голосов
/ 28 декабря 2010

У меня есть переменная, которая содержит число. В то время как Lua позволяет переменным быть установленными на nil, переменная становится токсичной, уничтожая весь код на своем пути.

Если переменная содержит nil, я хочу, чтобы она была преобразована в ноль.

local score;
score = gameResults.finalScore;

Я хочу убедиться, что score содержит число, поэтому я пытаюсь:

local score;
score = tonumber(gameResults.finalScore);

но это не работает. Поэтому я стараюсь:

local function ToNumberEx(v)
   if (v == nil) then
      return 0
   else
      return tonumber(v)
end

local score;
score = ToNumberEx(gameResults.finalScore);

но это не работает. Поэтому я стараюсь:

local function ToNumberEx(v)
   if (v == nil) then
      return 0
   else
      return tonumber(v)
end

local score;
score = ToNumberEx(gameResults.finalScore);

if (score == nil) then
   score = 0
end

Это работает, но побеждает цель иметь функцию.

Что не так с функцией? Я уверен, что есть вполне разумное и логичное объяснение - кроме тех, кто знаком с языками программирования.

Ответы [ 3 ]

15 голосов
/ 28 декабря 2010
score = tonumber(gameResults.finalScore) or 0
3 голосов
/ 29 декабря 2010

Если аргумент уже является числом или строка, преобразуемая в число, затем tonumber возвращает это число; в противном случае возвращается ноль.

Ваш код был хорош, за исключением того, что вы не приняли во внимание то, что происходит, когда gameResult.finalScore не может быть преобразовано в число, если это "" или "материал" или таблица, чем tonumber вернет ноль. Ни одна из ваших проверок не может обнаружить такую ​​ситуацию.

1 голос
/ 30 декабря 2010

Если вы действительно хотите обеспечить, чтобы эта переменная gameResults.finalScore имела такое поведение (устанавливается в ноль, когда получает любое значение, отличное от числа), тогда вам следует взглянуть на Lua metatables .

Вы можете создать метатаблицу для gameResults и «перезаписать» методы "index" и "newindex" метатаблицы, проверив значение для поля finalScore и, таким образом, принудительно установив его значение на желаемом диапазоны. * +1010 *

Не лучшее решение, но, в зависимости от вашего случая, может быть хорошей защитной практикой против какого-то другого «злого разработчика» в команде. : -)

www.lua.org / pil / 13.html (в настоящее время я не могу публиковать более 1 ссылки) PiL 1 также может помочь, если вы все еще используете Lua 5.0 или хотите более глубокое понимание концепция метатаблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...