09 · Estructuras de Datos
Caminos de campos tipados
field User::address.city crea un FieldPath<User, str> sin leer una instancia. get lee el campo; set devuelve una actualización inmutable y comparte hijos intactos. Conserva privacidad y tipos exactos; se rechazan miembros calculados y almacenamiento lineal.
En esta página
field User::address.city crea un FieldPath<User, str> sin leer una instancia. get lee el campo; set devuelve una actualización inmutable y comparte hijos intactos. Conserva privacidad y tipos exactos; se rechazan miembros calculados y almacenamiento lineal.
Ejemplo completo
Caminos de campos tipados.
23-typed-field-paths.zolo
// Item 20: a typed field path can be reused and its getter is a callback.
struct Address { city: str, postal_code: str }
struct User { name: str, address: Address, roles: [str] }
fn city_path() -> FieldPath<User, str> = field User::address.city
fn main() {
let city = city_path()
let original = User {
name: "Ana",
address: Address { city: "São Paulo", postal_code: "01000-000" },
roles: ["reader"],
}
let moved = city.set(original, "Recife")
print(city.get(original))
// expected: São Paulo
print(city.get(moved))
// expected: Recife
print(moved.address.postal_code)
// expected: 01000-000
let cities = [original, moved].map(city.get)
print(cities[0])
// expected: São Paulo
print(cities[1])
// expected: Recife
// The untouched collection is still shared by the immutable update.
moved.roles.push("reviewer")
print(original.roles.len())
// expected: 2
}
Reglas y comportamiento
Records, maps y actualizaciones · Documentación
Desde un checkout del repositorio:
zolo examples/features/06-data-structures/23-typed-field-paths.zolo
Consulta también