本文概述
它们不能存储在变量中, 不能作为参数传递给另一个服务, 也不能从其他函数返回。这是出于性能原因。
要在运行时通过函数名称引用函数(例如, 将其存储在变量中, 或将其作为参数传递给另一个函数), 必须使用call或funcref助手:
# Call a function by its name in one step.
my_node.call("my_function", args)
# Store a function reference.
var my_func = funcref(my_node, "my_function")
# Call stored function reference.
my_func.call_func(args)
记住默认函数, 如_init, 大多数通知, 如_enter_tree, _exit_tree, _process, _physics_process等, 都将在所有基类中自动调用。因此, 以某种方式重载函数时, 仅需要显式调用该函数。
静态函数
函数始终声明为静态。如果函数是静态的, 则可以访问实例成员变量或self。这用于制作辅助函数库。
static func sum2(a, b):
return a + b
语句和控制流程
它们是标准的, 可以是赋值, 函数调用, 控制流结构等(请参见下文);作为声明, 分隔符完全是可选的。
If / else / elif
通过使用if / else / elif语法创建简单条件。围绕条件的括号是允许的, 但不是必需的。给定基于选项卡的缩进的性质, 可以使用elif代替else / if来保持一定程度的缩进。
if [expression]:
statement(s)
elif [expression]:
statement(s)
else:
statement(s)
短语句可以与条件写在同一行:
If 1 + 1==2: return 2+2
else:
var x=3+3
return x
有时我们可能想基于布尔表达式分配一个不同的首字母。在这种情况下, 三元if表达式会派上用场:
var x=[value] if[expression] else [value]
y+=3 if y<10 else -1
而
通过使用while语法创建循环。循环可以使用break中断, 或使用continue继续:
而[表情]:
语句
对于
要遍历数组或表之类的范围, 请使用for循环。当遍历数组时, 数组元素h存储在循环变量中。迭代字典时, 具有b的索引存储在循环变量中。
for x in [5, 7, 11]:
statement # Loop iterates three times with 'x' as 5, then seven and finally 11.
var dict = {"a": 0, "b": 1, "c": 2}
for i in dict:
print(dict[i])
for i in range(3):
statement # Similar to the array [0, 1, 2] but does not allocate an array.
for i in range(1, 3):
statement # Similar to [1, 2] but cannot allocate an array.
for i in range(2, 8, 2):
statement # Similar to [2, 4, 6] but not allocate an array.
for c in "Hello":
print(c) # Iterate by all characters in an eString, print every letter on the new line.
比赛
match语句用于分支程序的执行。它等效于许多其他语言中的switch语句, 但提供了一些附加函数。
语法如下:
match [expression]:
[pattern](s):
[block]
[pattern](s):
[block]
[pattern](s):
[block]
切换语句:
- 用火柴替换开关
- 删除案例
- 删除所有中断。如果我们不想在默认情况下中断, 则可以使用Continue进行尝试。
- 将默认值更改为单个下划线。
控制流:
模式从上到下匹配。如果模式匹配, 则执行在match语句下继续。
如果我们想要通过, 可以使用continue停止当前块中的执行, 并检查其下的执行。
有六种模式类型:
- 恒定模式:
常量原语是数字和字符串
match x:
1:
print("We are number one!)
2:
print("Two are better than one!")
"test":
print("Oh snap! It's a string!")
- 可变模式
它匹配变量/枚举的内容
match typeof(x):
TYPE_FLOAT:
print("float")
TYPE_STRING:
print("text")
TYPE_ARRAY:
print("array")
- 通配符模式
此模式匹配所有内容。它写为单个下划线。
它与其他语言的switch语句中的默认值等效。
match x:
1:
print("It's one!")
2:
print("It's one time two!")
_:
print ("It's not 1 or 2. I don't care tbh.")
- 装订方式
绑定模式引入了一个新变量。像通配符模式一样, 它匹配所有内容-并为值赋一个名称。在数组和字典中很有用。
match x:
1:
print("It's one!")
2:
print("It's one times two!")
var new_var:
print("It is not 1 or 2, it is ", new_var)
- 阵列模式
数组模式中的每个元素都是一个模式本身, 因此我们可以将它们嵌套。测试阵列的长度;它必须与图案大小相同;否则, 无法匹配。
开放式数组:通过制作最后一个子模式, 使数组大于模式。
每个子模式都用逗号分隔。
match x:
[]:
print("Empty array")
[1, 3, "test", null]:
print("Very specific array")
[var start, _, "test"]:
print("First element is ", start, ", and the last is \"test\"")
[42, ..]:
print("Open ended array")
- 词典模式
它的作用与数组模式相同。每个键都有一个恒定的模式。测试字典的大小;首先, 它具有与图案相同的尺寸;否则, 模式不匹配。
开放式词典:通过使之前的子模式成为可能, 词典比模式更重要…
每个子模式都必须用逗号分隔。
如果不指定值, 则仅检查键的存在。
值模式与键模式之间的分隔符为:
match x:
{}:
print("Empty dict")
{"name": "Dennis"}:
print("The name is Dennis")
{"name": "Dennis", "age": var age}:
print("Dennis is ", age, " years old.")
{"name", "age"}:
print("Has a name and an age, but it is not Dennis :(")
{"key": "godotisawesome", ..}:
print("I checked for one entry and ignored the rest")
多模式
我们还可以指定多个模式, 以逗号分隔。这些模式不允许包含任何绑定。
match x:
1, 2, 3:
print("It's 1 - 3")
"Sword", "Splash potion", "Fist":
print("Yep, you've taken damage")
评论前必须登录!
注册