diff --git a/16_interfaces/casting.v b/16_interfaces/casting.v index 7b4c443..79398f1 100644 --- a/16_interfaces/casting.v +++ b/16_interfaces/casting.v @@ -2,21 +2,19 @@ struct Dog{ breed string - speak() string } -fn (d Dog) speak() string { - println('Woof') +fn (d Dog) speak() string{ + return 'Woof' } struct Cat{ breed string - speak() string } fn (c Cat) speak() string{ - println('Meow') + return 'Meow' } interface Something{} @@ -24,7 +22,7 @@ interface Something{} fn announce(s Something){ if s is Dog { - println('a ${s.breed] dog') + println('a ${s.breed} dog') }else if s is Cat{ println('a cat speaks ${s.speak()}') }else { diff --git a/16_interfaces/dynamic_casts.v b/16_interfaces/dynamic_casts.v new file mode 100644 index 0000000..d03c1b6 --- /dev/null +++ b/16_interfaces/dynamic_casts.v @@ -0,0 +1,34 @@ +struct Moon{} + +struct Mars{} + +struct Venus{} + +type World = Mars | Moon | Venus + +fn (m Mars) dust_storm() bool { + return true +} + +fn main(){ + mut w := World(Moon{}) + + assert w is Moon + w = Mars{} + + mars := w as Mars + + if mars.dust_storm(){ + println('bad weather!') + } + + //w1 := World(Mars{}) + + if mut w is Mars{ + assert typeof(w).name == typeof(Mars{}).name + + if w.dust_storm(){ + println('bad weather!') + } + } +} \ No newline at end of file diff --git a/16_interfaces/embedded_interface.v b/16_interfaces/embedded_interface.v new file mode 100644 index 0000000..7d26426 --- /dev/null +++ b/16_interfaces/embedded_interface.v @@ -0,0 +1,29 @@ +pub interface Reader{ +mut: + read(mut buf []u8) ?int +} + +pub interface Write{ +mut: + write(buf []u8) ?int +} + +pub interface ReaderWriter{ + Reader + Write +} + + +struct Moon{} +struct Mars{} +struct Venus{} + +type World = Mars | Moon | Venus + +fn main(){ + + sum := World(Moon{}) + assert sum.type_name() == 'Moon' + println(sum) + +} \ No newline at end of file diff --git a/16_interfaces/interface_example4.v b/16_interfaces/interface_example4.v new file mode 100644 index 0000000..91b71e1 --- /dev/null +++ b/16_interfaces/interface_example4.v @@ -0,0 +1,36 @@ +interface IFoo{ + foo() +} + +interface IBar{ + bar() +} + +struct SFoo{} + +fn (sf SFoo) foo() {} + + +struct SFooBar {} + +fn (sfb SFooBar) foo() {} + + +fn (sfb SFooBar) bar() { + dump('This implements IBar') +} + +fn main(){ + + mut arr := []IFoo{} + arr << SFoo{} + arr << SFooBar{} + + for a in arr{ + dump(a) + + if a is IBar{ + a.bar() + } + } +} \ No newline at end of file diff --git a/16_interfaces/interface_example5.v b/16_interfaces/interface_example5.v new file mode 100644 index 0000000..49776bb --- /dev/null +++ b/16_interfaces/interface_example5.v @@ -0,0 +1,34 @@ +interface Adoptable{} + +fn (a Adoptable) speak() string { + return 'adopt me!' +} + +struct Cat{} + +fn (c Cat) speak() string{ + return 'meow!' +} + +struct Dog{} + +fn main(){ + cat := Cat{} + + assert dump(cat.speak()) == 'meow!' + + a := Adoptable(cat) + + assert dump(a.speak()) == 'adopt me!' + + if a is Cat{ + dump(a.speak()) + } + + b := Adoptable(Dog{}) + assert dump(b.speak()) == 'adopt me!' + + //if b is Dog{ + // dump(b.speak()) + //} +} \ No newline at end of file diff --git a/16_interfaces/interface_example6.v b/16_interfaces/interface_example6.v new file mode 100644 index 0000000..0c5c795 --- /dev/null +++ b/16_interfaces/interface_example6.v @@ -0,0 +1,24 @@ +struct Empty{} + +struct Node{ + value f64 + left Tree + right Tree +} + +type Tree = Empty | Node + +fn sum(tree Tree) f64{ + return match tree { + Empty { 0 } + Node { tree.value + sum(tree.left) + sum(tree.right)} + } +} + +fn main(){ + left := Node{0.2,Empty{}, Empty{}} + right := Node{0.3, Empty{}, Node{0.4, Empty{},Empty{},}} + tree := Node{0.5, left, right} + + println(sum(tree)) +} \ No newline at end of file diff --git a/16_interfaces/matching_sum.v b/16_interfaces/matching_sum.v new file mode 100644 index 0000000..3e6faea --- /dev/null +++ b/16_interfaces/matching_sum.v @@ -0,0 +1,44 @@ +struct Moon{} + +struct Mars{} + +struct Venus{} + +type World = Mars | Moon | Venus + +fn open_parachutes(n int){ + println(n) +} + +fn land(w World){ + match w { + Moon{} + Mars{ + open_parachutes(3) + } + Venus{ + open_parachutes(1) + } + } +} + + +fn (m Moon) moon_walk(){} +fn(m Mars) shiver(){} +fn(v Venus) sweat(){} + +fn pass_time(w World){ + match w{ + Moon { w.moon_walk() } + Mars { w.shiver() } + else {} + } +} + +fn main(){ + + mut world := World(Mars{}) + + land(world) + pass_time(world) +} \ No newline at end of file diff --git a/README.md b/README.md index 6cf551b..9345695 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ ### Codes of my learning process in V Programming Language + +[V Documentation](https://github.com/vlang/v/blob/master/doc/docs.md) \ No newline at end of file