docs: extend the sum type docs (#6982)
parent
64fa5e6383
commit
04ecc4737c
88
doc/docs.md
88
doc/docs.md
|
@ -768,8 +768,10 @@ else {
|
|||
println(s) // "odd"
|
||||
```
|
||||
|
||||
#### Is check
|
||||
You can check sum types using `if` like `match`ing them.
|
||||
#### Type checks and casts
|
||||
You can check the current type of a sum type using `is` and its negated form `!is`.
|
||||
|
||||
You can do it either in an `if`:
|
||||
```v
|
||||
struct Abc {
|
||||
val string
|
||||
|
@ -781,22 +783,82 @@ type Alphabet = Abc | Xyz
|
|||
|
||||
x := Alphabet(Abc{'test'}) // sum type
|
||||
if x is Abc {
|
||||
// x is automatically cast to Abc and can be used here
|
||||
// x is automatically casted to Abc and can be used here
|
||||
println(x)
|
||||
}
|
||||
if x !is Abc {
|
||||
println('Not Abc')
|
||||
}
|
||||
```
|
||||
or using `match`:
|
||||
```v oksyntax
|
||||
match x {
|
||||
Abc {
|
||||
// x is automatically casted to Abc and can be used here
|
||||
println(x)
|
||||
}
|
||||
Xyz {
|
||||
// x is automatically casted to Xyz and can be used here
|
||||
println(x)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
If you have a struct field which should be checked, there is also a way to name an alias.
|
||||
```v ignore
|
||||
struct MyStruct {x int}
|
||||
struct MyStruct2 {y string}
|
||||
This works also with struct fields:
|
||||
```v
|
||||
struct MyStruct {
|
||||
x int
|
||||
}
|
||||
struct MyStruct2 {
|
||||
y string
|
||||
}
|
||||
|
||||
type MySumType = MyStruct | MyStruct2
|
||||
struct Abc { bar MySumType }
|
||||
x := Abc{ bar: MyStruct{123} }
|
||||
if x.bar is MyStruct as bar {
|
||||
// x.bar cannot be cast automatically
|
||||
// you must explicitly state "as bar" to create a variable with the MyStruct type
|
||||
println(bar)
|
||||
|
||||
struct Abc {
|
||||
bar MySumType
|
||||
}
|
||||
|
||||
x := Abc{
|
||||
bar: MyStruct{123} // MyStruct will be converted to MySumType type automatically
|
||||
}
|
||||
|
||||
if x.bar is MyStruct {
|
||||
// x.bar is automatically casted
|
||||
println(x.bar)
|
||||
}
|
||||
|
||||
match x.bar {
|
||||
MyStruct {
|
||||
// x.bar is automatically casted
|
||||
println(x.bar)
|
||||
}
|
||||
else {}
|
||||
}
|
||||
```
|
||||
|
||||
Mutable variables can change, and doing a cast would be unsafe.
|
||||
However, sometimes it's needed to have a type cast despite of mutability.
|
||||
In this case the developer has to mark the expression with a `mut` keyword
|
||||
to tell the compiler that you're aware of what you're doing.
|
||||
|
||||
It works like this:
|
||||
```v oksyntax
|
||||
mut x := MySumType(MyStruct{123})
|
||||
|
||||
if mut x is MyStruct {
|
||||
// x is casted to MyStruct even it's mutable
|
||||
// without the mut keyword that wouldn't work
|
||||
println(x)
|
||||
}
|
||||
|
||||
// same with match
|
||||
match mut x {
|
||||
MyStruct {
|
||||
// x is casted to MyStruct even it's mutable
|
||||
// without the mut keyword that wouldn't work
|
||||
println(x)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
|
Loading…
Reference in New Issue