Попытка понять простые коды Lua

У меня проблемы с Lua. Дело в том, что есть некоторые коды Lua, которые я знаю, что они делают, но я их не понял, поэтому, если профессора попросят меня объяснить их, я не смогу этого сделать. Можете ли вы помочь мне с этим?

  1. Я знаю, что этот код отделяет целую часть от десятичной части числа, но я не понял часть "(%d*)(%.?.*)$".

    int, dec = string.match(tostring(value), "(%d*)(%.?.*)$")
    
  2. Этот код вставляет в таблицу все данные из текстового файла, написанного по этой модели entry {name = "John", age = 20, sex = "Male"). Чего я не понял, так это того, как узнать, какие параметры нужны для загрузки функции? И последний параметр entry = entry, не знаю точно ли я понял его смысл: я думаю он получает text_from_file как кусок кода Lua и все что после входа отправляется в function entry, который вставляет его в таблицу, это это правильно?

    function entry(entrydata)
        table.insert(data, entrydata)           
    end
    
    thunk = load(text_from_file, nil, nil, {entry = entry})
    thunk()
    

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


person cfrancklin    schedule 27.05.2014    source источник


Ответы (1)


Для ответа на первый вопрос вам нужно немного узнать о паттернах lua и string.match.

Шаблон (%d*)(%.?.*)$ состоит из двух меньших. %d* и %.?.*. $ в конце просто указывает, что сопоставление должно выполняться до конца строки tostring(value). %d* будет соответствовать 0 или более числовым значениям и сохранит результат (если найден, иначе ноль) в переменной int.

%.? соответствует буквальному символу .. ? означает, что . может присутствовать или отсутствовать. .* соответствует всем и сохраняет их в переменной dec.


Аналогичным образом, для второго сегмента кода выполните load() ссылка. В вашем файле есть следующий текст:

entry {name = "John", age = 20, sex = "Male")

Это эквивалентно выполнению функции с именем entry с параметром (обратите внимание, что я использовал параметр, а не параметры) таблицы, как показано ниже:

entry( {name = "John", age = 20, sex = "Male") )

Последний параметр load определяет среду для загруженной строки. Передавая {entry = entry}, вы определяете среду, в которой у вас есть функция с именем entry. Чтобы лучше понять это, посмотрите на изменения в следующем сегменте:

function myOwnFunctionName(entrydata)
    table.insert(data, entrydata)
end

thunk = load(text_from_file, nil, nil, {entry = myOwnFunctionName})

Теперь пользовательская среда, переданная в load, будет иметь переменную с именем entry, которая на самом деле является функцией myOwnFunctionName.

person hjpotter92    schedule 27.05.2014