typetraits
Этот модуль определяет процедуры рефлексии времени компиляции для работы с типами.
Нестабильный API.
Импорты
- since, macros
Типы
StaticParam[value] = object
- используется для обертывания статического значения в
genericParamsИсходный код Редактировать
Процедуры
proc name(t: typedesc): string {...}{.magic: "TypeTrait".}-
Возвращает имя данного типа.
Псевдоним для system.`$`(t) начиная с Nim v0.20.
Исходный код Редактировать proc arity(t: typedesc): int {...}{.magic: "TypeTrait".}- Возвращает арность данного типа. Это количество компонентов "тип" или количество параметров обобщения данного типа
t.Пример:
assert arity(seq[string]) == 1 assert arity(array[3, int]) == 2 assert arity((int, int, float, string)) == 4
Исходный код Редактировать proc genericHead(t: typedesc): typedesc {...}{.magic: "TypeTrait".}-
Принимает экземплиар обобщенного типа и возвращает его неэкземплиар. Ошибка времени компиляции будет сгенерирована, если предоставленный тип не является обобщенным.
См. также:
Пример:
type Foo[T] = object FooInst = Foo[int] Foo2 = genericHead(FooInst) doAssert Foo2 is Foo and Foo is Foo2 doAssert genericHead(Foo[seq[string]]) is Foo doAssert not compiles(genericHead(int)) type Generic = concept f type _ = genericHead(typeof(f)) proc bar(a: Generic): typeof(a) = a doAssert bar(Foo[string].default) == Foo[string]() doAssert not compiles bar(string.default) when false: # these don't work yet doAssert genericHead(Foo[int])[float] is Foo[float] doAssert seq[int].genericHead is seq
Исходный код Редактировать proc stripGenericParams(t: typedesc): typedesc {...}{.magic: "TypeTrait".}- Этот признак аналогичен genericHead, но вместо генерации ошибки для необобщенных типов он просто вернёт их без изменений. Исходный код Редактировать
proc supportsCopyMem(t: typedesc): bool {...}{.magic: "TypeTrait".}-
Этот признак возвращает true, если тип
tбезопасен для использования с copyMem.В других языках тип, подобный этому, называется blob.
Исходный код Редактировать proc isNamedTuple(T: typedesc): bool {...}{.magic: "TypeTrait".}- Возвращает true для именованных кортежей, false для любого другого типа. Исходный код Редактировать
proc distinctBase(T: typedesc): typedesc {...}{.magic: "TypeTrait".}- Возвращает базовый тип для различных типов, работает только для различных типов. В противном случае произойдет ошибка времени компиляции. Исходный код Редактировать
proc tupleLen(T: typedesc[tuple]): int {...}{.magic: "TypeTrait".}- Возвращает количество элементов
TИсходный код Редактировать
Шаблоны
template distinctBase[T](a: T): untyped
- перегрузка для значений
Пример:
type MyInt = distinct int doAssert 12.MyInt.distinctBase == 12
Исходный код Редактировать template tupleLen(t: tuple): int
- Возвращает количество элементов
tИсходный код Редактировать template get(T: typedesc[tuple]; i: static int): untyped
- Возвращает
i-й элементTИсходный код Редактировать template elementType(a: untyped): typedesc
- возвращает тип элемента
a, который может быть любым итерируемым объектом (по которому можно итерироваться)Пример:
iterator myiter(n: int): auto = for i in 0..<n: yield i doAssert elementType(@[1,2]) is int doAssert elementType("asdf") is char doAssert elementType(myiter(3)) is intИсходный код Редактировать template genericParams(T: typedesc): untyped
- возвращает кортеж обобщенных параметров для обобщенного
TПример:
type Foo[T1, T2] = object doAssert genericParams(Foo[float, string]) is (float, string) type Bar[N: static float, T] = object doAssert genericParams(Bar[1.0, string]) is (StaticParam[1.0], string) doAssert genericParams(Bar[1.0, string]).get(0).value == 1.0 doAssert genericParams(seq[Bar[2.0, string]]).get(0) is Bar[2.0, string] var s: seq[Bar[3.0, string]] doAssert genericParams(typeof(s)) is (Bar[3.0, string],) # NOTE: For the builtin array type, the index generic param will # **always** become a range type after it's bound to a variable. doAssert genericParams(array[10, int]) is (StaticParam[10], int) var a: array[10, int] doAssert genericParams(typeof(a)) is (range[0..9], int)
Исходный код Редактировать
Экспорт
- $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $, $
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/typetraits.html