Конкатенация строк в Lua

Нет никакого ошибочного события для тега script. Можно сказать, когда это успешно, и предположите, что это не загрузилось после тайм-аута:

<script type="text/javascript" onload="loaded=1" src="....js"></script>
54
задан John Mark Mitchell 10 September 2009 в 03:24
поделиться

4 ответа

Как уже говорилось в других ответах, оператор конкатенации строк в Lua - это две точки.

Ваш простой пример мог бы быть записан так:

filename = "checkbook"
filename = filename .. ".tmp"

Однако есть предостережение, о котором следует помнить. Поскольку строки в Lua неизменяемы, каждая конкатенация создает новый строковый объект и копирует в него данные из исходных строк. Это приводит к очень низкой производительности последовательных конкатенаций в одну строку.

Идиома Lua для этого случая выглядит примерно так:

function listvalues(s)
    local t = { }
    for k,v in ipairs(s) do
        t[#t+1] = tostring(v)
    end
    return table.concat(t,"\n")
end

Собирая строки для конкатенации в массив t , стандартная библиотечная процедура table.concat может быть используется для их объединения (вместе со строкой-разделителем между каждой парой) без ненужного копирования строк.

Обновление: Я только что заметил, что изначально я написал приведенный выше фрагмент кода, используя pair () вместо ipairs () .

Как было написано изначально, функция listvalues ​​() действительно выдает каждое значение из переданной таблицы, но не в стабильном или предсказуемом порядке. С другой стороны, он будет включать значения, ключи которых не являются положительными целыми числами в диапазоне от 1 до #s . Именно это и делает pair () : он производит каждую отдельную пару (ключ, значение), хранящуюся в таблице.

В большинстве случаев, когда вы использовали бы что-то вроде listvaluas () ] вы были бы заинтересованы в сохранении их порядка. Таким образом, вызов, записанный как listvalues ​​{13, 42, 17, 4} , приведет к созданию строки, содержащей эти значения в указанном порядке. Однако, Pair () этого делать не будут, они будут перечислять их в некотором порядке, который зависит от базовой реализации структуры данных таблицы. Известно, что порядок зависит не только от ключей, но и от порядка, в котором ключи были вставлены и другие ключи удалены.

Конечно, ipairs () тоже не идеальный ответ. . Он перечисляет только те значения таблицы, которые образуют «последовательность». То есть те значения, ключи которых образуют сплошной блок, охватывающий от 1 до некоторой верхней границы, которая (обычно) также является значением, возвращаемым оператором # . (Во многих случаях саму функцию ipairs () лучше заменить на более простой цикл for , который просто считает от 1 до #s ] Это рекомендованная практика в Lua 5. 2 и в LuaJIT, где более простой цикл for может быть реализован более эффективно, чем итератор ipairs () .)

Если pair () действительно является правильный подход, то обычно бывает так, что вы хотите распечатать и ключ, и значение. Это снижает озабоченность по поводу порядка, делая данные самоописывающими. Конечно, поскольку любой тип Lua (кроме nil и с плавающей запятой NaN ) может использоваться в качестве ключа (а NaN также может быть сохранен как значение ) поиск строкового представления оставлен в качестве упражнения для учащегося. И не забывайте о деревьях и более сложных структурах таблиц.

)

Если pair () действительно правильный подход, то обычно это тот случай, когда вы хотите распечатать и ключ, и значение. Это снижает озабоченность по поводу порядка, делая данные самоописывающими. Конечно, поскольку любой тип Lua (кроме nil и с плавающей запятой NaN ) может использоваться в качестве ключа (а NaN также может быть сохранен как значение ) поиск строкового представления оставлен в качестве упражнения для учащегося. И не забывайте о деревьях и более сложных структурах таблиц.

)

Если pair () действительно правильный подход, то обычно это тот случай, когда вы хотите распечатать и ключ, и значение. Это снижает озабоченность по поводу порядка, делая данные самоописывающими. Конечно, поскольку любой тип Lua (кроме nil и с плавающей запятой NaN ) может использоваться в качестве ключа (а NaN также может быть сохранен как значение ) поиск строкового представления оставлен в качестве упражнения для учащегося. И не забывайте о деревьях и более сложных структурах таблиц.

поскольку любой тип Lua (кроме nil и с плавающей запятой NaN ) может использоваться в качестве ключа (и NaN также может быть сохранен как значение), поиск строковое представление оставлено в качестве упражнения для студента. И не забывайте о деревьях и более сложных структурах таблиц.

поскольку любой тип Lua (кроме nil и с плавающей запятой NaN ) может использоваться в качестве ключа (и NaN также может быть сохранен как значение), поиск строковое представление оставлено в качестве упражнения для студента. И не забывайте о деревьях и более сложных структурах таблиц.

97
ответ дан 7 November 2019 в 07:51
поделиться

Если вы спрашиваете, есть ли сокращенная версия оператора .. - нет, нет. Вы не можете написать a .. = b . Вам нужно будет ввести его полностью: filename = filename .. ".tmp"

17
ответ дан 7 November 2019 в 07:51
поделиться

Конкатенация:

Оператор конкатенации строк в Lua обозначается двумя точками ('..'). Если оба операнда являются строками или числами, они преобразуются в строки в соответствии с правилами, упомянутыми в §2.2.1. В противном случае вызывается метаметод "concat" (см. §2.8).

от: http://www.lua.org/manual/5.1/manual.html#2.5.4

7
ответ дан 7 November 2019 в 07:51
поделиться

Строки можно соединить вместе с помощью оператора конкатенации ".."

, я думаю, то же самое для переменных

1
ответ дан 7 November 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: