Hoje encontrei aqui uma sintaxe um tanto estranha - where ()
:
https://github.com/binator/self/tree/80ba2ade?tab=readme-ov-file#example
fn hex_primary<Stream, Context>(stream: Stream) -> Parsed<u8, Stream, Context>
where
(): IntRadixParse<Stream, Context, u8>,
{
uint_radix(2, Radix::HEX).parse(stream)
}
Para mim parece "limitado ao tipo unitário (também conhecido como tupla vazia )", mas não consigo entender. Um tipo unitário não implementa todas as características por padrão, certo? Infelizmente, a documentação oficial é muito vaga e não é completa o suficiente (ao mesmo tempo em que é excessivamente prolixa), e não consegui encontrar nada relacionado nela.
A cláusula RFC for original where
também menciona essa sintaxe, mas sem explicação adequada:
https://rust-lang.github.io/rfcs/0135-where.html#alternatives
fn increment<T>(c: T) -> T
where () : Add<int,T,T>
{
1 + c
}
Mas além disso, eu sei que tais limites podem ser especificados não apenas em genéricos de traits.
Então o que é, quando é usado, por que é necessário e quais problemas ele resolve?