docs: add implements keyword for explicit interface implementations (#22214)

This commit is contained in:
Laurent Cheylus 2024-09-13 13:59:38 +00:00 committed by GitHub
parent 56013a443a
commit 888d84d26d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -687,7 +687,7 @@ To use a format specifier, follow this pattern:
- width: may be an integer value describing the minimum width of total field to output. - width: may be an integer value describing the minimum width of total field to output.
- precision: an integer value preceded by a `.` will guarantee that many digits after the decimal - precision: an integer value preceded by a `.` will guarantee that many digits after the decimal
point without any insignificant trailing zeros. If displaying insignificant zero's is desired, point without any insignificant trailing zeros. If displaying insignificant zero's is desired,
append a `f` specifier to the precision value (see examples below). Applies only to float append a `f` specifier to the precision value (see examples below). Applies only to float
variables and is ignored for integer variables. variables and is ignored for integer variables.
- type: `f` and `F` specify the input is a float and should be rendered as such, `e` and `E` specify - type: `f` and `F` specify the input is a float and should be rendered as such, `e` and `E` specify
the input is a float and should be rendered as an exponent (partially broken), `g` and `G` specify the input is a float and should be rendered as an exponent (partially broken), `g` and `G` specify
@ -3598,7 +3598,6 @@ fn main() {
#### Implement an interface #### Implement an interface
A type implements an interface by implementing its methods and fields. A type implements an interface by implementing its methods and fields.
There is no explicit declaration of intent, no "implements" keyword.
An interface can have a `mut:` section. Implementing types will need An interface can have a `mut:` section. Implementing types will need
to have a `mut` receiver, for methods declared in the `mut:` section to have a `mut` receiver, for methods declared in the `mut:` section
@ -3645,6 +3644,30 @@ fn fn1(s Foo) {
// } // }
``` ```
There is an **optional** `implements` keyword for explicit declaration
of intent, which applies to `struct` declarations.
```v
struct PathError implements IError {
Error
path string
}
fn (err PathError) msg() string {
return 'Failed to open path: ${err.path}'
}
fn try_open(path string) ! {
return PathError{
path: path
}
}
fn main() {
try_open('/tmp') or { panic(err) }
}
```
#### Casting an interface #### Casting an interface
We can test the underlying type of an interface using dynamic cast operators. We can test the underlying type of an interface using dynamic cast operators.
@ -4040,7 +4063,7 @@ user := repo.find_user_by_id(7) or {
#### Options/results when returning multiple values #### Options/results when returning multiple values
Only one `Option` or `Result` is allowed to be returned from a function. It is Only one `Option` or `Result` is allowed to be returned from a function. It is
possible to return multiple values and still signal an error. possible to return multiple values and still signal an error.
```v ```v