三小時學會V語言到放棄(第二小時)


root@SW-SERVER:~/v_test# cat hi.v
//結構體
struct point{
        x int
        y int
}
/*
struct Foo{
        a int    //私有 不可變

        mut:    //私有 可變
        b int
        c int

        pub:    //公開 不可變
        d int

        pub mut:     //公開 僅在父模塊
        e int

        pub mut mut:    //公開 父模塊內外都可以用
        f int
}
*/

//結構體-方法
struct User{
        age int
        mut:
                is_registered int
}
//(u User) u 相當於self or this
/*
V 沒有 class概念,但是我們可以在結構體上定義方法。
方法是具有特殊行參的函數。特殊行參 放在 fn關鍵字 和方法名之間的參數列表中。

簡單示例(can_register 方法具有 User 類型的 特殊行參 u):

不和其他語言一樣,使用 self 或 this ,而是使用短名稱,當然最好一個字母長

*/
fn (u User) can_register() bool{
        return u.age > 16
}

/*
純函數
V語言的函數默認是純函數,也就是函數的輸出結果只依賴輸入的參數,並且沒有其它的影響。
因爲V語言沒有全局變量,且所有的參數默認都是隻讀的,即使傳入的引用也是默認只讀的。
然後V語言並不純的函數式語言。我們可以通過mut來修飾行參數,使得可以被修改:
*/
fn (u mut User) register(){
        u.is_registered = 10
}



struct Color{
        r int
        g int
        b int
}

fn (c Color) str() string{return '{$c.r,$c.g,$c.b}'}
fn rgb(r,g,b int) Color {return Color{r:r,g:g,b:b}}

//常量
const(
        Numbers = [1,2,3]
        Red = Color{r:255,g:0,b:0}
        Blue = rgb(0,0,255)
)

fn main()
{
        p := point{
                x: 10
                y: 20
        }
        println(p.x)
        println(p.y)

        p1 := &point{30,40}
        println(p1.x)
        println(p1.y)

        mut user := User{age:10}
        mut user1 := User{age:20}
        println(user.is_registered)
        println(user1.can_register())
        user.register()
        println(user.is_registered)
        println(Numbers)
        println(Red)
        println(Blue)
}


root@SW-SERVER:~/v_test# cat interface.v
//interface 接口
struct Dog{}
struct Cat{}

fn (d Dog) speak() string{
        return 'woof'
}

fn (c Cat) speak() string{
        return 'meow'
}

interface Speaker{
        speak() string
}

fn perform(s Speaker){
        println(s.speak())
}

//枚舉
enum Color{
        red green blue
}

//可選類型 和 錯誤處理
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){
        for user in r.users{
                if user.id == id{
                        return user
                }
        }
        return error('User $id not found')
}

fn main(){
        dog := Dog{}
        cat := Cat{}
        perform(dog)
        perform(cat)

        mut color := Color.red
        println(color)
        color = .green
        println(color)

        repo := new_repo()
        user := repo.find_user_by_id(10) or {
                return
        }

        println(user.id)
        println(user.name)
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章