纯 D 函数要在 运行 时间计算(不是编译时间)
Pure D function to be calculated at run time (not compile time)
我很好奇:如果有纯D函数的话,编译时可以算出来
如果不是想要一个纯函数在编译时计算,而是要在运行时计算,怎么办?
示例:
static int result = f();
f
是一个纯函数,我希望它在 运行 时间计算。
仅供参考,并非所有纯函数都可以在编译时计算,并且纯函数并不要求是编译时 运行。他们之间其实关系不大。
尝试对任何函数进行编译时函数评估,但仅在必须这样做时才这样做。这是由上下文决定的——答案必须在编译时出现吗?这适用于:
- 枚举值
- 静态初始化器
- 条件静态
- 静态 foreach 参数
- 模板参数
如果您因此想要在 运行 时使用它,只需在这些上下文之一之外调用它。
static int result = f();
以上是静态初始化程序,因此是 CTFE。
static int result;
result = f();
这不再是静态初始化程序,因此没有 CTFE。为了防止它被调用两次,你可以用一个特殊的值对它进行常规 if
检查,这意味着它还没有 运行 或者用一个单独的 bool 标志。
如果这是在模块范围内,请使用构造函数:
static int result;
static this() { result = f(); }
我很好奇:如果有纯D函数的话,编译时可以算出来
如果不是想要一个纯函数在编译时计算,而是要在运行时计算,怎么办?
示例:
static int result = f();
f
是一个纯函数,我希望它在 运行 时间计算。
仅供参考,并非所有纯函数都可以在编译时计算,并且纯函数并不要求是编译时 运行。他们之间其实关系不大。
尝试对任何函数进行编译时函数评估,但仅在必须这样做时才这样做。这是由上下文决定的——答案必须在编译时出现吗?这适用于:
- 枚举值
- 静态初始化器
- 条件静态
- 静态 foreach 参数
- 模板参数
如果您因此想要在 运行 时使用它,只需在这些上下文之一之外调用它。
static int result = f();
以上是静态初始化程序,因此是 CTFE。
static int result;
result = f();
这不再是静态初始化程序,因此没有 CTFE。为了防止它被调用两次,你可以用一个特殊的值对它进行常规 if
检查,这意味着它还没有 运行 或者用一个单独的 bool 标志。
如果这是在模块范围内,请使用构造函数:
static int result;
static this() { result = f(); }