typeinfo
Этот модуль реализует интерфейс для информации о типах Nim во время выполнения (runtime type information) (RTTI). См. модуль marshal для примера того, что позволяет сделать этот модуль.
Обратите внимание, что, хотя Any и его операции скрывают от клиентов неприятные низкоуровневые детали, он по-прежнему остается небезопасным! Кроме того, информация о типе Nim во время выполнения будет развиваться и, возможно, в конечном итоге будет устаревшим. В качестве альтернативного подхода к программно пониманию и манипулированию типами рассмотрите возможность использования пакета macros для работы с представлением AST типов во время компиляции. См., например, процедуру getTypeImpl proc. В качестве альтернативного подхода к хранению произвольных типов во время выполнения рассмотрите использование дженериков.
Типы
AnyKind = enum akNone = 0, ## invalid any akBool = 1, ## any represents a ``bool`` akChar = 2, ## any represents a ``char`` akEnum = 14, ## any represents an enum akArray = 16, ## any represents an array akObject = 17, ## any represents an object akTuple = 18, ## any represents a tuple akSet = 19, ## any represents a set akRange = 20, ## any represents a range akPtr = 21, ## any represents a ptr akRef = 22, ## any represents a ref akSequence = 24, ## any represents a sequence akProc = 25, ## any represents a proc akPointer = 26, ## any represents a pointer akString = 28, ## any represents a string akCString = 29, ## any represents a cstring akInt = 31, ## any represents an int akInt8 = 32, ## any represents an int8 akInt16 = 33, ## any represents an int16 akInt32 = 34, ## any represents an int32 akInt64 = 35, ## any represents an int64 akFloat = 36, ## any represents a float akFloat32 = 37, ## any represents a float32 akFloat64 = 38, ## any represents a float64 akFloat128 = 39, ## any represents a float128 akUInt = 40, ## any represents an unsigned int akUInt8 = 41, ## any represents an unsigned int8 akUInt16 = 42, ## any represents an unsigned in16 akUInt32 = 43, ## any represents an unsigned int32 akUInt64 = 44 ## any represents an unsigned int64
- какой тип
anyИсходный код Редактировать Any = object value: pointer when defined(js): rawType: PNimType else: rawTypePtr: pointer- может представлять любое значение Nim; ПРИМЕЧАНИЕ: значение, заключенное в оболочку, может быть изменено его оболочкой! Это означает, что
Anyхранит неотслеживаемый указатель на оборачиваемое значение, и не должен существовать дольше, чем оборачиваемое значение. Исходный код Редактировать
Процедуры
proc toAny[T](x: var T): Any {...}{.inline.}- Создаёт объект
Anyизx. Это захватывает адресx, поэтомуxможно изменить с помощью его оберткиAny! Клиент должен убедиться, что обертка не живёт дольше, чемx! Исходный код Изменить proc kind(x: Any): AnyKind {...}{.inline, raises: [], tags: [].}- Получает тип. Исходный код Изменить
proc size(x: Any): int {...}{.inline, raises: [], tags: [].}- Возвращает размер типа
x. Исходный код Изменить proc baseTypeKind(x: Any): AnyKind {...}{.inline, raises: [], tags: [].}- Получает тип базового типа;
akNoneвозвращается, если уxнет базового типа. Исходный код Изменить proc baseTypeSize(x: Any): int {...}{.inline, raises: [], tags: [].}- Возвращает размер базового типа
x. Исходный код Изменить proc invokeNew(x: Any) {...}{.raises: [], tags: [].}- Выполняет
new(x).xдолжен представлятьref. Исходный код Изменить proc invokeNewSeq(x: Any; len: int) {...}{.raises: [], tags: [].}- Выполняет
newSeq(x, len).xдолжен представлятьseq. Исходный код Изменить proc extendSeq(x: Any) {...}{.raises: [], tags: [].}- Выполняет
setLen(x, x.len+1).xдолжен представлятьseq. Исходный код Изменить proc setObjectRuntimeType(x: Any) {...}{.raises: [], tags: [].}- Необходимо вызвать для установки поля типа объекта runtime
x. Исходный код Изменить proc `[]`(x: Any; i: int): Any {...}{.raises: [ValueError], tags: [].}- Доступ к любому
x, который представляет массив или последовательность. Исходный код Изменить proc `[]=`(x: Any; i: int; y: Any) {...}{.raises: [ValueError], tags: [].}- Доступ к любому
x, который представляет массив или последовательность. Исходный код Изменить proc len(x: Any): int {...}{.raises: [], tags: [].}-
lenдля любогоx, представляющего массив или последовательность. Исходный код Изменить proc base(x: Any): Any {...}{.raises: [], tags: [].}- Возвращает базовый Any (полезно для типов унаследованных объектов). Исходный код Изменить
proc isNil(x: Any): bool {...}{.raises: [], tags: [].}-
isNilдля любогоx, представляющего cstring, proc или указатель. Исходный код Изменить proc getPointer(x: Any): pointer {...}{.raises: [], tags: [].}- Извлекает значение указателя из
x.xдолжен быть типаakString,akCString,akProc,akRef,akPtr,akPointer,akSequence. Исходный код Изменить proc setPointer(x: Any; y: pointer) {...}{.raises: [], tags: [].}- Устанавливает значение указателя для
x.xдолжен быть типаakString,akCString,akProc,akRef,akPtr,akPointer,akSequence. Исходный код Изменить proc `[]=`(x: Any; fieldName: string; value: Any) {...}{.raises: [ValueError], tags: [].}- Устанавливает поле
x;xпредставляет объект или кортеж. Исходный код Изменить proc `[]`(x: Any; fieldName: string): Any {...}{.raises: [ValueError], tags: [].}- Получает поле
x;xпредставляет объект или кортеж. Исходный код Изменить proc `[]`(x: Any): Any {...}{.raises: [], tags: [].}- Операция разыменования для любого
x, который представляет указатель или ссылку. Исходный код Изменить proc `[]=`(x, y: Any) {...}{.raises: [], tags: [].}- Операция разыменования для любого
x, который представляет указатель или ссылку. Исходный код Изменить proc getInt(x: Any): int {...}{.raises: [], tags: [].}- Получает целочисленное значение из
x.xдолжен представлять целое число. Исходный код Изменить proc getInt8(x: Any): int8 {...}{.raises: [], tags: [].}- Получает значение int8 из
x.xдолжен представлять int8. Исходный код Изменить proc getInt16(x: Any): int16 {...}{.raises: [], tags: [].}- Получает значение int16 из
x.xдолжен представлять int16. Исходный код Изменить proc getInt32(x: Any): int32 {...}{.raises: [], tags: [].}- Получает значение int32 из
x.xдолжен представлять int32. Исходный код Изменить proc getInt64(x: Any): int64 {...}{.raises: [], tags: [].}- Получает значение int64 из
x.xдолжен представлять int64. Исходный код Изменить proc getBiggestInt(x: Any): BiggestInt {...}{.raises: [], tags: [].}- Получает целое значение из
x.xдолжен представлять целое число, bool, char, перечисление или достаточно маленький набор битов. Значение может быть расширено со знаком доBiggestInt. Исходный код Изменить proc setBiggestInt(x: Any; y: BiggestInt) {...}{.raises: [], tags: [].}- Устанавливает целочисленное значение для
x.xдолжен представлять целое число, bool, char, перечисление или достаточно маленький набор битов. Исходный код Изменить proc getUInt(x: Any): uint {...}{.raises: [], tags: [].}- Получает значение uint из
x,xдолжно представлять uint. Исходный код Изменить proc getUInt8(x: Any): uint8 {...}{.raises: [], tags: [].}- Получает значение uint8 из
x,xдолжно представлять uint8. Исходный код Изменить proc getUInt16(x: Any): uint16 {...}{.raises: [], tags: [].}- Получает значение uint16 из
x,xдолжно представлять uint16. Исходный код Изменить proc getUInt32(x: Any): uint32 {...}{.raises: [], tags: [].}- Получает значение uint32 из
x,xдолжно представлять uint32. Исходный код Изменить proc getUInt64(x: Any): uint64 {...}{.raises: [], tags: [].}- Получает значение uint64 из
x,xдолжно представлять uint64. Исходный код Изменить proc getBiggestUint(x: Any): uint64 {...}{.raises: [], tags: [].}
- Извлекает целое беззнаковое значение из
x.xдолжно представлять целое беззнаковое значение. Источник Редактировать proc setBiggestUint(x: Any; y: uint64) {...}{.raises: [], tags: [].}- Устанавливает беззнаковое целое значение для
c.cдолжно представлять целое беззнаковое значение. Источник Редактировать proc getChar(x: Any): char {...}{.raises: [], tags: [].}- Извлекает значение char из
x.xдолжно представлять char. Источник Редактировать proc getBool(x: Any): bool {...}{.raises: [], tags: [].}- Извлекает значение bool из
x.xдолжно представлять bool. Источник Редактировать proc skipRange(x: Any): Any {...}{.raises: [], tags: [].}- Пропускает информацию о диапазоне для
x. Источник Редактировать proc getEnumOrdinal(x: Any; name: string): int {...}{.raises: [], tags: [].}- Получает порядковый номер поля перечисления из
name.xдолжно представлять перечисление, но используется только для доступа к информации о типе. В случае ошибки возвращаетсяlow(int). Источник Редактировать proc getEnumField(x: Any; ordinalValue: int): string {...}{.raises: [], tags: [].}- Получает имя поля перечисления в виде строки.
xдолжно представлять перечисление, но используется только для доступа к информации о типе. Возвращается имя поляordinalValue. Источник Редактировать proc getEnumField(x: Any): string {...}{.raises: [], tags: [].}- Получает имя поля перечисления в виде строки.
xдолжно представлять перечисление. Источник Редактировать proc getFloat(x: Any): float {...}{.raises: [], tags: [].}- Извлекает значение float из
x.xдолжно представлять float. Источник Редактировать proc getFloat32(x: Any): float32 {...}{.raises: [], tags: [].}- Извлекает значение float32 из
x.xдолжно представлять float32. Источник Редактировать proc getFloat64(x: Any): float64 {...}{.raises: [], tags: [].}- Извлекает значение float64 из
x.xдолжно представлять float64. Источник Редактировать proc getBiggestFloat(x: Any): BiggestFloat {...}{.raises: [], tags: [].}- Извлекает значение float из
x.xдолжно представлять какое-то float. Значение расширено доBiggestFloat. Источник Редактировать proc setBiggestFloat(x: Any; y: BiggestFloat) {...}{.raises: [], tags: [].}- Устанавливает значение float для
x.xдолжно представлять какое-то float. Источник Редактировать proc getString(x: Any): string {...}{.raises: [], tags: [].}- Извлекает строковое значение из
x.xдолжно представлять строку. Источник Редактировать proc setString(x: Any; y: string) {...}{.raises: [], tags: [].}- Устанавливает строковое значение для
x.xдолжно представлять строку. Источник Редактировать proc getCString(x: Any): cstring {...}{.raises: [], tags: [].}- Извлекает значение cstring из
x.xдолжно представлять cstring. Источник Редактировать proc assign(x, y: Any) {...}{.raises: [], tags: [].}- Копирует значение
yвx. Оператор присваивания дляAnyэтого НЕ делает; он выполняет поверхностную копию! Источник Редактировать proc inclSetElement(x: Any; elem: int) {...}{.raises: [], tags: [].}- Включает элемент
elemвx.xдолжно представлять набор битов Nim. Источник Редактировать
Итераторы
iterator fields(x: Any): tuple[name: string, any: Any] {...}{.raises: [], tags: [].}- Итерируется по каждому активному полю объекта или кортежа, представленного
x. Источник Редактировать iterator elements(x: Any): int {...}{.raises: [], tags: [].}- Итерируется по каждому элементу
x, представляющему набор битов Nim. Источник Редактировать
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/typeinfo.html