mirror of
https://github.com/godotengine/godot-docs.git
synced 2026-01-04 14:11:02 +03:00
Merge pull request #7507 from dalexeev/gds-var-init-order
GDScript: Document variable initialization order
This commit is contained in:
@@ -976,7 +976,7 @@ value upon initialization.
|
||||
var a # Data type is 'null' by default.
|
||||
var b = 5
|
||||
var c = 3.8
|
||||
var d = b + c # Variables are always initialized in order.
|
||||
var d = b + c # Variables are always initialized in direct order (see below).
|
||||
|
||||
Variables can optionally have a type specification. When a type is specified,
|
||||
the variable will be forced to have always that same type, and trying to assign
|
||||
@@ -1018,6 +1018,49 @@ Valid types are:
|
||||
You can turn off this check, or make it only a warning, by changing it in
|
||||
the project settings. See :ref:`doc_gdscript_warning_system` for details.
|
||||
|
||||
Initialization order
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Member variables are initialized in the following order:
|
||||
|
||||
1. Depending on the variable's static type, the variable is either ``null``
|
||||
(untyped variables and objects) or has a default value of the type
|
||||
(``0`` for ``int``, ``false`` for ``bool``, etc.).
|
||||
2. The specified values are assigned in the order of the variables in the script,
|
||||
from top to bottom.
|
||||
- *(Only for ``Node``-derived classes)* If the ``@onready`` annotation is applied to a variable, its initialization is deferred to step 5.
|
||||
3. If defined, the ``_init()`` method is called.
|
||||
4. When instantiating scenes and resources, the exported values are assigned.
|
||||
5. *(Only for ``Node``-derived classes)* ``@onready`` variables are initialized.
|
||||
6. *(Only for ``Node``-derived classes)* If defined, the ``_ready()`` method is called.
|
||||
|
||||
.. warning::
|
||||
|
||||
You can specify a complex expression as a variable initializer, including function calls.
|
||||
Make sure the variables are initialized in the correct order, otherwise your values
|
||||
may be overwritten. For example::
|
||||
|
||||
var a: int = proxy("a", 1)
|
||||
var b: int = proxy("b", 2)
|
||||
var _data: Dictionary = {}
|
||||
|
||||
func proxy(key: String, value: int):
|
||||
_data[key] = value
|
||||
print(_data)
|
||||
return value
|
||||
|
||||
func _init() -> void:
|
||||
print(_data)
|
||||
|
||||
Will print::
|
||||
|
||||
{ "a": 1 }
|
||||
{ "a": 1, "b": 2 }
|
||||
{ }
|
||||
|
||||
To fix this, move the ``_data`` variable definition above the ``a`` definition
|
||||
or remove the empty dictionary assignment (``= {}``).
|
||||
|
||||
Static variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
|
||||
Reference in New Issue
Block a user