• 注册
  • Option 类型 & 错误处理

    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中错误的主要方法。它们仍然是值,就像在Go中一样,但优点是错误无法处理,并且处理它们的冗长要少得多。

    您还可以传播错误:

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

    http.get返回?http.Response。它被调用,因此错误传播到调用函数(必须返回一个可选项)或者在main中引导到panic(ps:原文 or in case of main leads to a panic,没弄懂什么意思,根据完整版的代码,这里的意思应该是把错误信息用panic(err))。

    基本上上面的代码是一个简版的

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

    V没有办法强行打开可选项(像Rust的 unwrap() 或 Swift的 !),你必须使用or { panic(err) }替代

  • 单栏布局 侧栏位置: