mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
doc: clarify new static type methods a bit
This commit is contained in:
parent
d52bac8ee9
commit
21ccb9b48e
14
doc/docs.md
14
doc/docs.md
@ -97,7 +97,7 @@ by using any of the following commands in a terminal:
|
|||||||
* [Trailing struct literal arguments](#trailing-struct-literal-arguments)
|
* [Trailing struct literal arguments](#trailing-struct-literal-arguments)
|
||||||
* [Access modifiers](#access-modifiers)
|
* [Access modifiers](#access-modifiers)
|
||||||
* [Anonymous structs](#anonymous-structs)
|
* [Anonymous structs](#anonymous-structs)
|
||||||
* [Static type methods](#static-type-methods)
|
* [Static type methods](#static-type-methods)
|
||||||
* [[noinit] structs](#noinit-structs)
|
* [[noinit] structs](#noinit-structs)
|
||||||
* [Methods](#methods)
|
* [Methods](#methods)
|
||||||
* [Embedded structs](#embedded-structs)
|
* [Embedded structs](#embedded-structs)
|
||||||
@ -2435,16 +2435,24 @@ assert book.author.age == 24
|
|||||||
### Static type methods
|
### Static type methods
|
||||||
|
|
||||||
V now supports static type methods like `User.new()`. These are defined on a struct via
|
V now supports static type methods like `User.new()`. These are defined on a struct via
|
||||||
`fn [Type name].[function name] and allow to organize all functions related to a struct:
|
`fn [Type name].[function name]` and allow to organize all functions related to a struct:
|
||||||
|
|
||||||
```v oksyntax
|
```v oksyntax
|
||||||
struct User { }
|
struct User { }
|
||||||
|
|
||||||
fn User.new() User { return User{} }
|
fn User.new() User {
|
||||||
|
return User{}
|
||||||
|
}
|
||||||
|
|
||||||
user := User.new()
|
user := User.new()
|
||||||
```
|
```
|
||||||
|
|
||||||
|
This is an alternative to factory functions like `fn new_user() User {}` and should be used
|
||||||
|
instead.
|
||||||
|
|
||||||
|
Note, that these are not constructors, but simple functions. V doesn't have constructors or
|
||||||
|
classes.
|
||||||
|
|
||||||
### `[noinit]` structs
|
### `[noinit]` structs
|
||||||
|
|
||||||
V supports `[noinit]` structs, which are structs that cannot be initialised outside the module
|
V supports `[noinit]` structs, which are structs that cannot be initialised outside the module
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Copyright (c) 2019-2023 Alexander Medvednikov. All rights reserved.
|
// Copyright (c) 2019-2023 Alexander Medvednikov. All rights reserved.
|
||||||
// Use of this source code is governed by an MIT license
|
// Use of this source code is governed by an MIT license
|
||||||
// that ca be found in the LICENSE file.
|
// that can be found in the LICENSE file.
|
||||||
module parser
|
module parser
|
||||||
|
|
||||||
import v.ast
|
import v.ast
|
||||||
@ -299,7 +299,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
|||||||
&& p.peek_tok.kind == .dot && language == .v // `fn Foo.bar() {}`
|
&& p.peek_tok.kind == .dot && language == .v // `fn Foo.bar() {}`
|
||||||
if is_static_type_method {
|
if is_static_type_method {
|
||||||
type_name := p.tok.lit // "Foo"
|
type_name := p.tok.lit // "Foo"
|
||||||
rec.typ = p.parse_type() //_with_mut(false) // ast.Type(p.table.find_type_idx(name))
|
rec.typ = p.parse_type()
|
||||||
p.check(.dot)
|
p.check(.dot)
|
||||||
name = type_name.to_lower() + '__static__' + p.check_name() // "foo__bar"
|
name = type_name.to_lower() + '__static__' + p.check_name() // "foo__bar"
|
||||||
} else {
|
} else {
|
||||||
|
@ -2593,7 +2593,6 @@ fn (mut p Parser) name_expr() ast.Expr {
|
|||||||
is_generic_call := p.is_generic_call()
|
is_generic_call := p.is_generic_call()
|
||||||
is_generic_cast := p.is_generic_cast()
|
is_generic_cast := p.is_generic_cast()
|
||||||
is_generic_struct_init := p.is_generic_struct_init()
|
is_generic_struct_init := p.is_generic_struct_init()
|
||||||
// mut is_static_type_method := false
|
|
||||||
// p.warn('name expr $p.tok.lit $p.peek_tok.str()')
|
// p.warn('name expr $p.tok.lit $p.peek_tok.str()')
|
||||||
same_line := p.tok.line_nr == p.peek_tok.line_nr
|
same_line := p.tok.line_nr == p.peek_tok.line_nr
|
||||||
// `(` must be on same line as name token otherwise it's a ParExpr
|
// `(` must be on same line as name token otherwise it's a ParExpr
|
||||||
@ -2675,7 +2674,7 @@ fn (mut p Parser) name_expr() ast.Expr {
|
|||||||
return node
|
return node
|
||||||
} else {
|
} else {
|
||||||
// fn call
|
// fn call
|
||||||
// fn_call:
|
// fn_call
|
||||||
if is_option {
|
if is_option {
|
||||||
p.unexpected_with_pos(p.prev_tok.pos(),
|
p.unexpected_with_pos(p.prev_tok.pos(),
|
||||||
got: '${p.prev_tok}'
|
got: '${p.prev_tok}'
|
||||||
|
Loading…
Reference in New Issue
Block a user