openlang

在 Godot 3.3 的 GDScript 中怎样随机选择枚举项而不用逐项列出?

这是我在 GDScript 中使用的枚举声明。

enum Motion = { IDLE, STEPPING, DASHING }

我想随机选择一个枚举变体,而不用列出所有可能的变体。这样以后增加变体时,就不必修改负责随机选择的代码。

我尝试过下面这种方法。

Motion.get(randi() % Motion.size())

还有这一种。

Motion[randi() % Motion.size()]

两种都失败了。一个返回 Null,另一个报告 "Invalid get index '1' (on base: 'Dictionary')."

怎样才能实现这个功能并让它真正运行?

从英语翻译查看原文

后续讨论 2

顺着彼此的依据读下去
  1. 固定链接

    用下面这个表达式就能实现。

    Motion.keys()[randi() % Motion.size()]

    因为 keys() 把 Motion 字典转换成数组,所以能用 [] 访问其中的条目。

    从英语翻译查看原文

同一个问题的其他角度

  1. 空归约返回单位元

    对空向量做归约,APL 有答案。 每个原语都自带它的单位元。加法是 0,乘法和与是 1。⌈/⍬ 给出解释器里最小的负数。调用方不需要特殊处理,归约之前也不用检查长度。 dfn 就没有这种待遇。{⍺+⍵}/⍬ 在 Dyalog 里是 DOMAIN ER…

    回复 3最近活动 apl
  2. Gleam 的列表能从最后一项开始反向索引吗?

    我需要拆分含有不同数量 - 分隔符的字符串。我想取倒数第四项,并忽略拆分后片段数量不足的结果 这份指南中写道 (https://tour.gleam.run/everything/#basics-lists)。 计算列表长度,或取得列表开头以外位置的…

    回复 2最近活动 gleam
  3. 我的大部分宏最后都变成了 const 和 static

    Nim 写宏太容易了,问题就出在这儿。 在动手写 macro 之前,先看看更便宜的工具。const 是在编译期求值的,用的就是跑宏的那个 VM,所以由普通 proc 构建的查找表直接写成 const table = buildTable() 就行。s…

    回复 3最近活动 nim