kw where
Контекстное слово — ограничения дженериков, уточнения, фильтр for, запросы
Список слов: §1.4
Синтаксис
Where = "where" WClause { "," WClause } ;TypeAlias = "type" Ident [ Generics ] "=" ( [ "distinct" ] Type [ "where" Expr ] ) ;For = [ Label ":" ] [ "inline" ] "for" [ "await" ] Pattern "in" Expr [ "where" Expr ] Block ;Query = "from" Pattern "in" Expr { "where" Expr } [ "order" "by" Ord { "," Ord } ]
[ "group" "by" Expr "into" Ident ] [ "skip" Expr ] [ "take" Expr ]
[ "load" "(" IdentList ")" ] [ "select" Expr ] ;Грамматика: Прил. A
Определяется в
- 5.9 Выражения запросов — Форма: from x in источник (where e)\* (order by e (asc|desc)?, …)?
- 1.4 Ключевые слова — Зарезервированные (нельзя использовать как имена)
- 3.6 Псевдонимы, новые и уточнённые типы — distinct T создаёт новый номинальный тип с представлением T.
- 4.8 Дженерики — Параметры: типовые T, константные const N
- 5.6 Циклы — for принимает Iterable<T> (в том числе iter<T>, коллекции, диапазоны); for await — Streamable<T>.
- 6.1 Объявление функции — Без -> T возвращаемый тип — () (для приватных функций с телом => e тип выводится из e).
- 15.2 Рефлексия — reflect(T) -> TypeInfo (только comptime)
Примеры
let top = from o in db.Order
where o.userId == uid && o.total > MIN_TOTAL
order by o.createdAt desc
skip page * PAGE_SIZE
take PAGE_SIZE
load(items)
let names = from u in users where u.active select u.name // List в памяти
let byRole = from u in users group by u.role into g select (g.key, g.count())type Bytes2 = [u8; 2] // псевдоним, тот же тип
type UserId = distinct u64 // новый тип, без неявных приведений
type Port = u16 where 1..=65535 // уточнённый тип
type Name = str where len(1..=64)
type Email = str where matches(re".+@.+\..+")— 3.6 Псевдонимы, новые и уточнённые типы
Связанные диагностики
query-not-sql, refinement-violated, bound-not-satisfied, generic-args, break-value, outside-loop, arg-count, named-arg