function CALC()
print("First number:")
local input1 = io.read("*n")
print("operator: ")
local operator = io.read("*l")
print("secondNumber:")
local input2 = io.read("*n")
local switchCalc = {
["+"] = function ()
local result = input1 + input2
print(result)
end,
["-"] = function ()
local result = input1 - input2
print(result)
end,
["*"] = function ()
local result = input1 * input2
print(result)
end,
["/"] = function ()
local result = input1 / input2
print(result)
end
}
local a = 1
local f = switchCalc[a]
if (f) then
f()
else
print("Default")
end
end
CALC()
Мой вывод:
Первый номер: 10
оператор:
второй номер: *
По умолчанию
Надеюсь, кто-нибудь поможет мне с этим, потому что я в главной роли с пары часов, и я действительно не понимаю
Насколько я знаю:
print("First number:") -- prints -> First number:
local input1 = io.read("*n") -- when you write 10 , buffer got "10(enter)"
-- now buffer is "(enter)"
print("operator: ") -- prints -> operator:
local operator = io.read("*l") -- buffer not empty then operator is "(enter)"
print("secondNumber:")
local input2 = io.read("*n") -- try to read "*"
решение: добавить io.read("*l")
перед print("operator: ")
или использовать io.read() не io.read("*n")
/io.read("*l")
Это имеет смысл, но проблема в том, что я использую vs-код, и каждая используемая переменная имеет более яркий цвет, чем операторы. Значит не используется. Я также пытался добавить io.read("*l")
перед печатью оператора, и это все еще не работает. Спасибо за помощь в любом случае.
Я предлагаю использовать io.read() без каких-либо аргументов.
Также это больше похоже на подсказку при использовании io.write()
Но преобразовать его в то, что просят на лету...
-- calc.lua (Tested with Lua 5.4)
local function calc()
io.write("First number: ") local input1 = tonumber(io.read()) -- number
io.write("Operator: ") local operator = io.read() -- Let a string be a string
io.write("Second number: ") local input2 = tonumber(io.read()) -- number
print('Equals to:', load('return '.. input1 .. operator .. input2)())
end
return calc
И тогда...
> calc = require('calc')
> calc()
First number: 3
Operator: *
Second number: 3
Equals to: 9
Проблема не в том, что «код пропускает io.read
», как вы это представляете, а в том, что вы просто неправильно используете переменные; чтение просто прекрасно.
Строка local f = switchCalc[a]
использует глобальную переменную a
, которую вы не определили (и которая точно не является оператором). Таким образом, будет nil
. switchCalc[nil]
снова nil
, поэтому f
будет nil
. Теперь if
не срабатывает, else
вводится, и вы получаете «По умолчанию» в качестве вывода. Решение простое: просто сделайте это switchCalc[operator]
.
Два примечания:
if
-условий, если вы используете пробел;io.read()
то же, что и io.read("*l")
(можно опустить "*l"
)Спасибо, это сработало, изменив swtichCalc[a]
на swtichCalc[operator]
Никогда не используйте
io.read("*n")
— вместо этого используйтеio.read("*n", "*l")
.