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