diff --git a/doc/docs.md b/doc/docs.md index 11454768eb..2401d0f505 100644 --- a/doc/docs.md +++ b/doc/docs.md @@ -36,7 +36,7 @@ you can do in V. * [Match](#match) * [Defer](#defer) * [Structs](#structs) - * [Short struct init syntax](#short-struct-initialization-syntax) + * [Trailing struct literal syntax](#short-struct-initialization-syntax) * [Access modifiers](#access-modifiers) * [Methods](#methods) * [println](#println) @@ -715,21 +715,30 @@ struct Point { y int } -p := Point{ +mut p := Point{ x: 10 y: 20 } 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. +

 

Structs are allocated on the stack. To allocate a struct on the heap and get a reference to it, use the `&` prefix: ```v - // Alternative initialization syntax for structs with 3 fields or fewer p := &Point{10, 10} // References have the same syntax for accessing fields 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. -### 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 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 @@ -807,7 +819,7 @@ instead of 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 diff --git a/vlib/v/tests/struct_test.v b/vlib/v/tests/struct_test.v index e5f1316252..c52ab337b9 100644 --- a/vlib/v/tests/struct_test.v +++ b/vlib/v/tests/struct_test.v @@ -235,22 +235,33 @@ struct Config { 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() { - foo_config({ +fn test_struct_literal_args() { + foo_config(20, { n: 10 def: 20 }) - foo_config({}) - foo2({ + foo_config(10, {}) + foo_config(10, n: 40) + foo_config(40, n: 30, def: 40) + + bar_config({}, 10) + bar_config({def:4}, 4) + + foo_user({ name: 'Peter' }) - foo2(name: 'Peter') + foo_user(name: 'Peter') + foo_user(age: 7) + foo_user(name: 'Stew', age: 50) } struct City {