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"
|
println(s) // "odd"
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Is check
|
#### Type checks and casts
|
||||||
You can check sum types using `if` like `match`ing them.
|
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
|
```v
|
||||||
struct Abc {
|
struct Abc {
|
||||||
val string
|
val string
|
||||||
|
@ -781,22 +783,82 @@ type Alphabet = Abc | Xyz
|
||||||
|
|
||||||
x := Alphabet(Abc{'test'}) // sum type
|
x := Alphabet(Abc{'test'}) // sum type
|
||||||
if x is Abc {
|
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)
|
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.
|
This works also with struct fields:
|
||||||
```v ignore
|
```v
|
||||||
struct MyStruct {x int}
|
struct MyStruct {
|
||||||
struct MyStruct2 {y string}
|
x int
|
||||||
|
}
|
||||||
|
struct MyStruct2 {
|
||||||
|
y string
|
||||||
|
}
|
||||||
|
|
||||||
type MySumType = MyStruct | MyStruct2
|
type MySumType = MyStruct | MyStruct2
|
||||||
struct Abc { bar MySumType }
|
|
||||||
x := Abc{ bar: MyStruct{123} }
|
struct Abc {
|
||||||
if x.bar is MyStruct as bar {
|
bar MySumType
|
||||||
// x.bar cannot be cast automatically
|
}
|
||||||
// you must explicitly state "as bar" to create a variable with the MyStruct type
|
|
||||||
println(bar)
|
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