Как мы можем взять ключ и значение как у пользователя, так и назначить их вместе

#lua

#lua

Вопрос:

** На самом деле я работаю над программой, в которой используется ввод строки, содержащей имя и номер, например, отрицание 40, я должен поместить его в таблицу, где Отрицание является ключом, а 40 — значением, чтобы я мог выполнить дальнейший процесс с таблицей.. **

 local class = {}
  for i=1,N or 0    --N enter by user no. of classmember
    local name=io.read() --takes the key
    local credit = io.read("*n","*l")--takes the credit as value
    
    class[name] = credit --assign the credit to the key

  end
  

Комментарии:

1. Хорошо. И что вы пытались до сих пор?

2. Я отредактировал, но при переключении с помощью ключа и значения я должен нажать enter, но я нахожу способ, при котором ключ и значение берутся в одной строке, разделенной пробелом, и присваиваются соответствующим образом..

Ответ №1:

Я предлагаю это:

 local credits = {}

while true do
    io.write 'Type name and credit or just press Enter to finish: '
    local name, credit  = io.read():match '^([^%d%s] )%s*(%d )$'
    if name then
        credits [name] = tonumber (credit)
    else
        break
    end
end

-- Show credits:
for name, credit in pairs (credits) do
    print (name .. "'s credit is " .. tostring (credit))
end
  
  • Пользователю будет предложено ввести строки, содержащие имя и число, в бесконечном цикле. Он завершится только тогда, когда пользователь введет пустую или неразличимую строку.
    • условие, которое завершает цикл, отсутствует в его заголовке (после while или until ), потому что это довольно сложно, включая печать приглашения и возврат двух переменных, которые необходимы в теле цикла. В более простых случаях это было бы не лучшим выбором (кроме того, присваивания в Lua не являются выражениями и не возвращают значение, в отличие от C или PHP),
    • но смотрите Обновление ниже!
  • Ввод пользователя немедленно анализируется на два захвата с помощью регулярного выражения.
    • [^%d%s] не означает ни цифры, ни пробела (мы не хотим, чтобы в именах были конечные пробелы); %s , пробел; %d , цифра; и , один или несколько.
  • name credit ) будет nil , как только пользователь введет что-то другое, чем Alice 10 или подобное; и break завершит цикл,
  • и если name это не nil так и, следовательно, не является ложным, значение credit будет записано credits под ключом name .

UPD: это более элегантное, но несколько эзотерическое решение, основанное на общем для:

 local credits = {}

local function get_credit ()
    io.write 'Type name and credit or just press Enter to finish: '
    return io.read():match '^([^%d%s] )%s*(%d )$'
end

for name, credit in get_credit do -- note the absence of ().
    credits [name] = tonumber (credit)
end
    
-- Show credits:
for name, credit in pairs (credits) do
    print (name .. "'s credit is " .. tostring (credit))
end