Что такое локальное имя = значение или 0 в lua? - PullRequest
0 голосов
/ 29 января 2019

Что делает этот блок кода?

local name = value or 0

Скажите, пожалуйста, что он равен нулю, если равен нулю, и равен значению, если не равен нулю.

1 Ответ

0 голосов
/ 29 января 2019

Короткий ответ

да

Looooong ответ

Вы правы.В то время как в других языках логические операторы возвращают либо true, либо false, Lua (и некоторые другие языки) делает что-то более умное:

Когда первый параметр or верен, он оценивается какэто значение, если это не так, оно оценивается как второе.И делает это наоборот: если его левая сторона ложная, он оценивает это, в противном случае он оценивает свою RHS.

Логически это означает, что or оценивает как истинный, если любой из операндовявляется правдивым и and оценивается как ложный, если любой из его операндов равен.

Это часто используется как эквивалент

if value then
  name = value
else
  name = 0
end

И он фактически делает то же самое.Также часто используется для присвоения значений по умолчанию переменным, как это:

function call(name)
  name = name or "you"
  print("Hey "..name.."! Come here for a moment!")
end

Обратите внимание, что это не работает

function alarm(real)
  real = real or true
  print "ALAAARM!"
  if real then print "This is NOT a drill!" end
end
alarm(false)

Это всегда выдает «ALAAARM!»«Это НЕ тренировка!», Потому что false оценивается как ложное, поэтому оператор or оценивает его RHS, равное true.В этом конкретном примере вам придется явно проверить, является ли аргумент nil.

-- ...
  real = (real == nil) and true or real
-- ...

Это будет работать как задумано, потому что только если real == nil, оператор and оценивается как trueor, таким образом, оценивается как его LHS.Если real == nil равно false, то and оценивает это, таким образом, оператор or оценивает его RHS (потому что его LHS false).

Стоит также отметить, что оба and и or закорочены.Это означает:

function foo(bar)
  print(bar)
  return bar
end
io.write "First: "
local A = foo(nil) or foo(false)
io.write "Second: "
local B = foo(true) or foo(true)

В первых двух строках будет напечатано «First: nil false», а в третьей - «Second: true».Последний вызов foo даже не выполняется, потому что в этот момент оператор or уже знает, что собирается вернуть свой левый операнд.

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