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 { // V automatically wraps this into an option type return user } } return error('User $id not found') } fn main() { repo := new_repo() user := repo.find_user_by_id(10) or { // Option types must be handled by `or` blocks return // `or` block must end with `return`, `break`, or `continue` } println(user.id) // ==> "10" println(user.name) // ==> 'Charles' }
V将Option和Result组合成一种类型,因此您无需决定使用哪种类型。
将函数“升级”为可选函数所需的工作量很小:您必须添加一个?
返回类型并在出现错误时返回错误。
如果您不需要返回错误,则只能return none
。 (TODO:none
还没有实现)。
这是V
中处理错误的主要方法。它们仍然是值,但是错误处理要简洁很多。
当然,错误是可以被传递的:
resp := http.get(url)? println(resp.body)
http.get
返回的是?http.Response
可选类型。如果错误发生,将传播到调用函数,这里是导致main函数抛出异常。
上面代码是下面代码的简写:
resp := http.get(url) or { panic(err) } println(resp.body)
V
没有办法强制打开一个可选项(比如Rust
的unwrap()
或Swift
中的!
)。 你必须使用或{panic(err)}
代替。