Equivalencia desde Kotlin
Clases de valor
DirectaUn newtype tuple struct no añade asignación ni indirección adicional: en tiempo de ejecución EvaluationBudget se representa igual que el i32 que envuelve. El constructor asociado devuelve un Result explícito en vez de lanzar una excepción.
Referencia Kotlin: Declarar un tipo nominal para un dato primitivo y validar su invariante al construirse.
- Mecanismo
- Newtype tuple struct con un constructor asociado que devuelve Result.
- Idea conservada
- El newtype no añade una asignación ni una indirección adicional: en tiempo de ejecución EvaluationBudget se representa igual que el i32 que envuelve.
- Riesgo de diseño
- Hacer público el campo tupla (pub struct EvaluationBudget(pub i32)), lo que permite construir valores sin pasar por new.
- Recomendación
- Mantén el campo privado y expón solo new devolviendo Result para que el llamador maneje el caso inválido explícitamente.
- Convención del curso
- Devuelve Result desde new; no entres en pánico dentro del constructor.
- Mecanismo del lenguaje
- Newtype tuple struct.
Diferencias relevantes
- La validación devuelve un Result explícito en vez de lanzar una excepción como en Kotlin.
- El campo interno es privado por convención de módulo, no por una palabra clave dedicada.
new devuelve un Result en vez de lanzar una excepción.
@JvmInline
value class EvaluationBudget(val remaining: Int) {
init {
require(remaining > 0) { "El presupuesto debe ser positivo." }
}
}
val budget = EvaluationBudget(1000) // remaining = 1000struct EvaluationBudget(i32);
impl EvaluationBudget {
fn new(remaining: i32) -> Result<Self, &'static str> {
if remaining <= 0 {
return Err("El presupuesto debe ser positivo.");
}
Ok(Self(remaining))
}
}
let budget = EvaluationBudget::new(1000).unwrap(); // remaining = 1000