publication: internal status: draft¶
Uma cláusula where declara uma condição obrigatória para o valor interno.
O predicado precisa ser uma lambda de um parâmetro escalar, com retorno bool,
sem efeitos e com capturas cuja imutabilidade possa ser provada. Any, capturas
mutáveis, aridade incorreta ou chamadas de pureza desconhecida não definem um
contrato verificável.
newtype Score(int) where |value| 0 <= value <= 100
let score = Score.new(42).unwrap()O construtor sempre retorna Result<Score, str>. Trate o erro ou propague
o Result antes de usar Score. Um valor rejeitado não adquire o tipo nominal.
Este diagnóstico também impede caminhos que contornam a construção, como construção estrutural do wrapper, alteração do payload ou conversão de Any diretamente para um newtype validado. Use o construtor com um valor do tipo escalar interno e trate sua resposta:
let raw: int = 42
let checked = Score.new(raw)
match checked {
Ok(score) => print(score.unwrap()),
Err(message) => print(message),
}Se a lambda usa um limite externo, ele precisa ser comprovadamente estável;
escrever let sozinho não constitui essa prova quando o mesmo binding
pode ser alterado. Mantenha o contrato independente de estado mutável.
Consulte Newtypes.
Any também não comprova o formato de inteiros com tamanho explícito ou f32. Para esses construtores validados, obtenha primeiro um escalar do tipo interno por uma conversão verificada. Não use um cast para o próprio newtype como atalho para a validação. Capturas externas de decimal ou bigdecimal exigem prova de um valor protegido; um binding sem reatribuição não comprova isso.