Size: a a a

2020 April 21

A

Ameliance SkyMusic in pro.lua
Snusmumriken
Есть тернарники:

local a = "foo"
local v = 100500

v = a == "foo" and (v + 1)
or a == "bar" and (v - 1)
or a == "baz" and 0
or -1

Или таблицы-свитчи:
local switch = {
  ["foo"] = function(v) return v + 1 end,
  ["bar"] = function(v) return v - 1 end,
  ["baz"] = function(v) return 0 end,
}

local a = "foo"
local v = 100500

v = switch[a] and switch[a](v) or 0
а-а-а-а... мои мозги пока не вывозят это все... наверное потому что я не понимаю некоторые моменты, потому что никогда не видел... (вчера что-то похожее в коде увидел, но тоже не до конца понял a = value or 0)

1.
v = a == "foo" and (v + 1)
or a == "bar" and (v - 1)
or -1

и 2.
v = switch[a] and switch[a](v) or 0

я  правильно понимаю?

1. v присваивается
(v + 1)
, если а равно
"foo"
, а если a равно
"bar"
, то v присваивается
(v + 1
), а если ни то v присваивается
-1
?

2. если a равно "foo", то в функцию switch.foo в качестве аргумента v ? посылается 100500
источник

A

Ameliance SkyMusic in pro.lua
хм.. почему телеграм разбил объяснение 1. на абзаци...
источник

AY

Arslan Yulbirdin in pro.lua
Конструкция cond and exp or exp - подобие краткого условия
источник

AY

Arslan Yulbirdin in pro.lua
Как в си "cond?exp:exp"
источник

S

Snusmumriken in pro.lua
Ага
источник

S

Snusmumriken in pro.lua
a = cond and exp1 or exp2, так немножко понятнее
источник

A

Ameliance SkyMusic in pro.lua
ок, это понял, а как насчет 1.?
источник

S

Snusmumriken in pro.lua
Ameliance SkyMusic
ок, это понял, а как насчет 1.?
v = a == "foo" and (v + 1)
or a == "bar" and (v - 1)
or -1
==
local v = 100500
if a == "foo" then
 v = v + 1
elseif a == "bar" then
 v = v - 1
else
 v = -1
end
источник

A

Ameliance SkyMusic in pro.lua
a = value or 0
а тут получается если value = nil, то присваивается 0?
источник

L

Leon174 in pro.lua
Ameliance SkyMusic
a = value or 0
а тут получается если value = nil, то присваивается 0?
Да. Или nil, или false. 0, получается, значение по умолчанию, если value не задано.

В PiL это все расписывается, книга есть и в переводе на русский, кроме вроде четвертого издания. Или смотреть ленивое вычисление булевых выражений.
источник

L

Leon174 in pro.lua
источник

A

Ameliance SkyMusic in pro.lua
Snusmumriken
v = a == "foo" and (v + 1)
or a == "bar" and (v - 1)
or -1
==
local v = 100500
if a == "foo" then
 v = v + 1
elseif a == "bar" then
 v = v - 1
else
 v = -1
end
+
источник

A

Ameliance SkyMusic in pro.lua
да, есть у меня ссылка, лажу туда как в справочник уточнить, только) просто не хочется весь язык учить, т.к. не кормит(
источник

S

Snusmumriken in pro.lua
Ameliance SkyMusic
a = value or 0
а тут получается если value = nil, то присваивается 0?
У луа, ложные значения только nil и false.

a = false or 10
--> a = 10

b = nil or 20
--> b = 20

c = {} or 30
--> c = table: 0x1234

Поэтому при попытке тернарить булеаны, можно напороться.
источник

A

Ameliance SkyMusic in pro.lua
Leon174
Да. Или nil, или false. 0, получается, значение по умолчанию, если value не задано.

В PiL это все расписывается, книга есть и в переводе на русский, кроме вроде четвертого издания. Или смотреть ленивое вычисление булевых выражений.
спасибо
источник

S

Snusmumriken in pro.lua
Ameliance SkyMusic
а-а-а-а... мои мозги пока не вывозят это все... наверное потому что я не понимаю некоторые моменты, потому что никогда не видел... (вчера что-то похожее в коде увидел, но тоже не до конца понял a = value or 0)

1.
v = a == "foo" and (v + 1)
or a == "bar" and (v - 1)
or -1

и 2.
v = switch[a] and switch[a](v) or 0

я  правильно понимаю?

1. v присваивается
(v + 1)
, если а равно
"foo"
, а если a равно
"bar"
, то v присваивается
(v + 1
), а если ни то v присваивается
-1
?

2. если a равно "foo", то в функцию switch.foo в качестве аргумента v ? посылается 100500
Во втором —
v = switch[a] and switch[a](v) or 0

switch[a] and switch[a](v)
 — проверяет, что в свитче есть значение [a], и если есть — вызывает его. Если такого нет — переходит к следующему or, и выставляет 0 как дефолт.
источник

TT

TONYMIN TGD in pro.lua
Snusmumriken
У луа, ложные значения только nil и false.

a = false or 10
--> a = 10

b = nil or 20
--> b = 20

c = {} or 30
--> c = table: 0x1234

Поэтому при попытке тернарить булеаны, можно напороться.
А как же NaN?
источник

S

Snusmumriken in pro.lua
Оно считается true, и это проблема. NaN очень сложно проверить на NaN, потому что оно ведёт себя как число, а при попытке арифметики — дропает приложение. Я на этом много костылил.

Поэтому просто не дели на ноль, ок да?
источник

TT

TONYMIN TGD in pro.lua
Ну в обычно луа ведь есть NaN или нет?
источник

S

Snusmumriken in pro.lua
Есть. Но как скрытая фигня. Прекрати делить на ноль!
источник