lunes, 10 de febrero de 2020

El lenguaje de programación V, Parte 8

Seguimos con V

V puede manejar datos nulos con resultados opcionales :

struct User {
id int
name string
}

struct Repo {
users []User
}

fn new_repo() Repo {
return Repo {
users: [User{1, 'Andrew'}, User {2, 'Bob'}, User {10, 'Charles'}]
}
}

fn (r Repo) find_user_by_id(id int) ?User {
for user in r.users {
if user.id == id {
return user
}
}
return error('User $id not found')
}

fn main() {
repo := new_repo()
user := repo.find_user_by_id(10) or { // Los tipos de opciones deben manejarse mediante bloques `or`
return  // El bloque `or` debe terminar con` return`, `break` o` continue`
}
println(user.id) // "10"
println(user.name) // "Charles"
}

V combina Opcionales y Resultado en un solo tipo, por lo que no necesita decidir cuál usar.

Si no necesita devolver un error, simplemente puede devolver none.

Esta es la forma principal de manejar los errores en V. Es similar a Go, pero la ventaja es que los errores pueden ser manejados, y manejarlos es mucho menos complicado.

err se define dentro de un bloque or y se establece el mensaje de error. err está vacío si no se devolvió algún error.

user := repo.find_user_by_id(7) or {
println(err) // "User 7 not found"
return
}

También puede propagar errores:

resp := http.get(url)?
println(resp.body)

http.get devuelve? http.Response. Se llamó con?, Por lo que el error se propaga a la función de llamada (que debe devolver un opcional) o en caso de que los cables principales entren en pánico.

Básicamente, el código anterior es una versión más corta de

resp := http.get(url) or {
panic(err)
}
println(resp.body)

V no tiene una forma de forzar el desenvolvimiento de un opcional (como el desenvolvimiento de Rust () o el de Swift). Tienes que usar o {panic (err)} en su lugar.

V también tienen generics :

struct Repo<T> {
db DB
}

fn new_repo<T>(db DB) Repo<T> {
return Repo<T>{db: db}
}

// Esta es una función genérica.
fn (r Repo<T>) find_by_id(id int) ?T {
table_name := T.name // en este ejemplo, obtener el nombre del tipo nos da el nombre de la tabla
return r.db.query_one<T>('select * from $table_name where id = ?', id)
}

db := new_db()
users_repo := new_repo<User>(db)
posts_repo := new_repo<Post>(db)
user := users_repo.find_by_id(1)?
post := posts_repo.find_by_id(1)?


Dejo link: https://vlang.io/


No hay comentarios.:

Publicar un comentario