В принципе, дисперсия применяется, когда CLR может гарантировать, что ей не нужно делать какие-либо репрезентативные изменения к значениям. Все ссылки одинаковы, поэтому вы можете использовать IEnumerable
как IEnumerable
без каких-либо изменений в представлении; сам собственный код не обязательно должен знать, что вы делаете со значениями, если инфраструктура гарантировала, что он определенно будет действительным.
Для типов значений, которые не work - для обработки IEnumerable
как IEnumerable
, код, использующий последовательность, должен был бы знать, следует ли выполнять преобразование бокса или нет.
Возможно, вы захотите прочитать блог Эрика Липперта пост по представлению и идентичности для более подробной информации по этой теме в целом.
EDIT: перечитав блог в блоге Эрика, это как минимум примерно тождество как представление, хотя эти два связаны. В частности:
Вот почему ковариантные и контравариантные преобразования интерфейса и типов делегатов требуют, чтобы все переменные аргументы типа были ссылочными типами. Чтобы гарантировать, что вариантное преобразование ссылок всегда сохраняется с сохранением идентичности, все преобразования, связанные с аргументами типа, также должны сохраняться в идентичности. Самый простой способ гарантировать, что все нетривиальные преобразования в аргументах типа сохраняют сохранение идентичности, - это ограничение их ссылок на ссылки.
blockquote>
Lua не использует стандартные регулярные выражения для сопоставления с образцом. Цитата из книги Программирование на Lua объясняет причину:
В отличие от нескольких других языков сценариев, Lua не использует регулярные выражения POSIX (regexp) для сопоставления с образцом. Основная причина этого - размер: типичная реализация регулярного выражения POSIX занимает более 4000 строк кода. Это больше, чем все стандартные библиотеки Lua вместе взятые. Для сравнения, реализация сопоставления с образцом в Lua содержит менее 500 строк. Конечно, сопоставление с образцом в Lua не может делать всего того, что делает полная реализация POSIX. Тем не менее сопоставление с образцом в Lua является мощным инструментом и включает некоторые функции, которые трудно сопоставить со стандартными реализациями POSIX.
Однако существует множество привязок к существующим библиотекам регулярных выражений, а также к расширенной библиотеке LPeg . Их список со ссылками см. В http://lua-users.org/wiki/LibrariesAndBindings , глава Обработка текста
.
См. Также этот вопрос: Сравнение шаблонов Lua и регулярных выражений
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
Регулярные выражения Lua ... ненормальны. Насколько я могу судить из документации, нет поддержки ни для общего чередования, ни для применения операторов повторения к группам. В вашем случае, как вы говорите, вы можете получить то, что хотите, с помощью класса персонажа (хотя я не уверен, что делает запятая в вашем классе персонажа).
См. Здесь: http://www.lua.org/manual/5.1/manual.html#5.4.1
(В проекте, над которым я работал, мы написали нашу собственную привязку Lua к PCRE из-за этого.)