Логично 'или' в шаблонах Lua?

В принципе, дисперсия применяется, когда CLR может гарантировать, что ей не нужно делать какие-либо репрезентативные изменения к значениям. Все ссылки одинаковы, поэтому вы можете использовать IEnumerable как IEnumerable без каких-либо изменений в представлении; сам собственный код не обязательно должен знать, что вы делаете со значениями, если инфраструктура гарантировала, что он определенно будет действительным.

Для типов значений, которые не work - для обработки IEnumerable как IEnumerable, код, использующий последовательность, должен был бы знать, следует ли выполнять преобразование бокса или нет.

Возможно, вы захотите прочитать блог Эрика Липперта пост по представлению и идентичности для более подробной информации по этой теме в целом.

EDIT: перечитав блог в блоге Эрика, это как минимум примерно тождество как представление, хотя эти два связаны. В частности:

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

blockquote>

11
задан Yu Hao 2 June 2014 в 01:32
поделиться

3 ответа

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

В отличие от нескольких других языков сценариев, Lua не использует регулярные выражения POSIX (regexp) для сопоставления с образцом. Основная причина этого - размер: типичная реализация регулярного выражения POSIX занимает более 4000 строк кода. Это больше, чем все стандартные библиотеки Lua вместе взятые. Для сравнения, реализация сопоставления с образцом в Lua содержит менее 500 строк. Конечно, сопоставление с образцом в Lua не может делать всего того, что делает полная реализация POSIX. Тем не менее сопоставление с образцом в Lua является мощным инструментом и включает некоторые функции, которые трудно сопоставить со стандартными реализациями POSIX.

Однако существует множество привязок к существующим библиотекам регулярных выражений, а также к расширенной библиотеке LPeg . Их список со ссылками см. В http://lua-users.org/wiki/LibrariesAndBindings , глава Обработка текста .

См. Также этот вопрос: Сравнение шаблонов Lua и регулярных выражений

10
ответ дан 3 December 2019 в 08:02
поделиться

Lua сопоставление с образцом не то же самое, что регулярные выражения, и не имеет концепции чередования.

Например, если вы хотите удалить «abc» или «efg» из конца строки (аналогично «(abc | efg) $» регулярное выражение) следующий код будет работать нормально:

local inputstring="123efgabc"
local s,n = inputstring:gsub("abc$", "")
if n == 0 then
  s,n = inputstring:gsub("efg$", "")
end
print(s) --> 123efg
5
ответ дан 3 December 2019 в 08:02
поделиться

Регулярные выражения Lua ... ненормальны. Насколько я могу судить из документации, нет поддержки ни для общего чередования, ни для применения операторов повторения к группам. В вашем случае, как вы говорите, вы можете получить то, что хотите, с помощью класса персонажа (хотя я не уверен, что делает запятая в вашем классе персонажа).

См. Здесь: http://www.lua.org/manual/5.1/manual.html#5.4.1

(В проекте, над которым я работал, мы написали нашу собственную привязку Lua к PCRE из-за этого.)

0
ответ дан 3 December 2019 в 08:02
поделиться
Другие вопросы по тегам:

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