| 1 | // use option without ? or an or block in places where it is not allowed |
| 2 | |
| 3 | fn foo() ? { |
| 4 | println('foo is called') |
| 5 | } |
| 6 | |
| 7 | fn bar[T](v T) ?T { |
| 8 | return none |
| 9 | } |
| 10 | |
| 11 | const const_value = bar(0) |
| 12 | |
| 13 | struct Data { |
| 14 | f fn (int) = unsafe { nil } |
| 15 | mut: |
| 16 | value int = bar(0) |
| 17 | opt ?int = bar(0) |
| 18 | } |
| 19 | |
| 20 | fn (mut v Data) add(n int) { |
| 21 | v.value += n |
| 22 | } |
| 23 | |
| 24 | fn twice(n int) int { |
| 25 | return n * 2 |
| 26 | } |
| 27 | |
| 28 | fn main() { |
| 29 | // call fn |
| 30 | foo() |
| 31 | _ := bar(0) |
| 32 | println(twice(bar(0))) |
| 33 | |
| 34 | // anon fn |
| 35 | fn (_ int) {}(bar(0)) |
| 36 | |
| 37 | // assert |
| 38 | assert bar(true) |
| 39 | |
| 40 | // struct |
| 41 | mut v := Data{ |
| 42 | f: fn (_ int) {} |
| 43 | value: bar(0) |
| 44 | opt: bar(0) |
| 45 | } |
| 46 | v.add(bar(0)) // call method |
| 47 | v.f(bar(0)) // call fn field |
| 48 | |
| 49 | // array |
| 50 | mut arr := [1, 2] |
| 51 | arr << bar(0) |
| 52 | // init |
| 53 | _ := [bar(0)] |
| 54 | _ := []int{len: 1, init: bar(0)} |
| 55 | _ := [bar(0)]! |
| 56 | _ := [1]int{init: bar(0)} |
| 57 | // index |
| 58 | println(arr[bar(0)]) |
| 59 | // array builtin methods |
| 60 | arr.insert(0, bar(0)) |
| 61 | arr.prepend(bar(0)) |
| 62 | arr.contains(bar(0)) |
| 63 | arr.index(bar(0)) |
| 64 | println(arr.map(bar(0))) |
| 65 | println(arr.filter(bar(true))) |
| 66 | println(arr.any(bar(true))) |
| 67 | println(arr.all(bar(true))) |
| 68 | |
| 69 | match bar(0) { |
| 70 | 0 {} |
| 71 | else {} |
| 72 | } |
| 73 | } |
| 74 | |