引用函数

本文概述

  • 语句和控制流程
  • 多模式
它们不能存储在变量中, 不能作为参数传递给另一个服务, 也不能从其他函数返回。这是出于性能原因。
要在运行时通过函数名称引用函数(例如, 将其存储在变量中, 或将其作为参数传递给另一个函数), 必须使用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]

切换语句:
  1. 用火柴替换开关
  2. 删除案例
  3. 删除所有中断。如果我们不想在默认情况下中断, 则可以使用Continue进行尝试。
  4. 将默认值更改为单个下划线。
控制流:
模式从上到下匹配。如果模式匹配, 则执行在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")

    推荐阅读