Spec-Zone.ru › Nim 1

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".}

Принимает экземплиар обобщенного типа и возвращает его неэкземплиар. Ошибка времени компиляции будет сгенерирована, если предоставленный тип не является обобщенным.

См. также:

  • stripGenericParams

Пример:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API