个性化阅读
专注于IT技术分析

引用函数

本文概述

它们不能存储在变量中, 不能作为参数传递给另一个服务, 也不能从其他函数返回。这是出于性能原因。

要在运行时通过函数名称引用函数(例如, 将其存储在变量中, 或将其作为参数传递给另一个函数), 必须使用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")

赞(0)
未经允许不得转载:srcmini » 引用函数

评论 抢沙发

评论前必须登录!