add documentation and changelog for default object fields (#20845)

This commit is contained in:
ringabout 2022-11-15 15:42:01 +08:00 • committed by GitHub
commit 4a3be7e29e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 0 deletions

View file

@ -1950,6 +1950,57 @@ Some restrictions for case objects can be disabled via a `{.cast(uncheckedAssign
t.kind = intLit
```
Default values for object fields
--------------------------------
Object fields are allowed to have a constant default value. The type of field can be omitted if a default value is given.
```nim test
type
Foo = object
a: int = 2
b: float = 3.14
c = "I can have a default value"
Bar = ref object
a: int = 2
b: float = 3.14
c = "I can have a default value"
```
The explicit initialization uses these defaults which includes an `object` created with an object construction expression or the procedure `default`; a `ref object` created with an object construction expression or the procedure `new`; an array or a tuple with a subtype which has a default created with the procedure `default`.
```nim test
type
Foo = object
a: int = 2
b = 3.0
Bar = ref object
a: int = 2
b = 3.0
block: # created with an object construction expression
let x = Foo()
assert x.a == 2 and x.b == 3.0
let y = Bar()
assert y.a == 2 and y.b == 3.0
block: # created with an object construction expression
let x = default(Foo)
assert x.a == 2 and x.b == 3.0
let y = default(array[1, Foo])
assert y[0].a == 2 and y[0].b == 3.0
let z = default(tuple[x: Foo])
assert z.x.a == 2 and z.x.b == 3.0
block: # created with the procedure `new`
let y = new Bar
assert y.a == 2 and y.b == 3.0
```
Set type
--------