doc: struct literals (#5726)

pull/5723/head
Nick Treleaven 2020-07-08 15:02:35 +01:00 committed by GitHub
parent 64e9bdc213
commit f834276803
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 15 deletions

View File

@ -36,7 +36,7 @@ you can do in V.
* [Match](#match) * [Match](#match)
* [Defer](#defer) * [Defer](#defer)
* [Structs](#structs) * [Structs](#structs)
* [Short struct init syntax](#short-struct-initialization-syntax) * [Trailing struct literal syntax](#short-struct-initialization-syntax)
* [Access modifiers](#access-modifiers) * [Access modifiers](#access-modifiers)
* [Methods](#methods) * [Methods](#methods)
* [println](#println) * [println](#println)
@ -715,21 +715,30 @@ struct Point {
y int y int
} }
p := Point{ mut p := Point{
x: 10 x: 10
y: 20 y: 20
} }
println(p.x) // Struct fields are accessed using a dot println(p.x) // Struct fields are accessed using a dot
// Alternative literal syntax for structs with 3 fields or fewer
p = Point{10, 20}
assert p.x == 10
// you can omit the struct name when it's already known
p = {x: 30, y: 4}
assert p.y == 4
``` ```
Omitting the struct name also works for function arguments.
<p>&nbsp;</p> <p>&nbsp;</p>
Structs are allocated on the stack. To allocate a struct on the heap Structs are allocated on the stack. To allocate a struct on the heap
and get a reference to it, use the `&` prefix: and get a reference to it, use the `&` prefix:
```v ```v
// Alternative initialization syntax for structs with 3 fields or fewer
p := &Point{10, 10} p := &Point{10, 10}
// References have the same syntax for accessing fields // References have the same syntax for accessing fields
println(p.x) println(p.x)
@ -772,9 +781,10 @@ All struct fields are zeroed by default during the creation of the struct. Array
It's also possible to define custom default values. It's also possible to define custom default values.
### Short struct initialization syntax <a id='short-struct-initialization-syntax' />
### Trailing struct literal syntax
There are no default function argument values or named arguments, for that the short struct initialization syntax can be used instead: There are no default function arguments or named arguments, for that trailing struct literal syntax can be used instead:
```v ```v
struct ButtonConfig { struct ButtonConfig {
@ -792,7 +802,9 @@ fn new_button(c ButtonConfig) &Button {
} }
} }
button := new_button(text:'Click me', width:100) // the height is unset, so it's 20, the default value button := new_button(text:'Click me', width:100)
// the height is unset, so it's the default value
assert button.height == 20
``` ```
As you can see, we can use As you can see, we can use
@ -807,7 +819,7 @@ instead of
new_button(ButtonConfig{text:'Click me', width:100}) new_button(ButtonConfig{text:'Click me', width:100})
``` ```
This only works with functions that have a single struct argument. This only works for functions that have a struct for the last argument.
### Access modifiers ### Access modifiers

View File

@ -235,22 +235,33 @@ struct Config {
def int = 10 def int = 10
} }
fn foo_config(c Config) { fn foo_config(def int, c Config) {
assert c.def == def
}
fn bar_config(c Config, def int) {
assert c.def == def
} }
fn foo2(u User) { fn foo_user(u User) {}
}
fn test_config() { fn test_struct_literal_args() {
foo_config({ foo_config(20, {
n: 10 n: 10
def: 20 def: 20
}) })
foo_config({}) foo_config(10, {})
foo2({ foo_config(10, n: 40)
foo_config(40, n: 30, def: 40)
bar_config({}, 10)
bar_config({def:4}, 4)
foo_user({
name: 'Peter' name: 'Peter'
}) })
foo2(name: 'Peter') foo_user(name: 'Peter')
foo_user(age: 7)
foo_user(name: 'Stew', age: 50)
} }
struct City { struct City {