Я сделал калькулятор lua, чтобы выучить язык, но когда я запускаю код, он пропускает io.read

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
оператор:
второй номер:
*
По умолчанию
Надеюсь, кто-нибудь поможет мне с этим, потому что я в главной роли с пары часов, и я действительно не понимаю

Никогда не используйте io.read("*n") — вместо этого используйте io.read("*n", "*l").

Egor Skriptunoff 17.03.2022 21:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
37
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Насколько я знаю:

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") перед печатью оператора, и это все еще не работает. Спасибо за помощь в любом случае.

Matteo Krstic 17.03.2022 19:28

Я предлагаю использовать 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]

Matteo Krstic 17.03.2022 19:56

Другие вопросы по теме