Compilation 在运行时(非编译时)计算的纯D函数

Compilation 在运行时(非编译时)计算的纯D函数,compilation,runtime,d,pure-function,Compilation,Runtime,D,Pure Function,我很好奇:如果有一个纯D函数,它可以在编译时计算 如果我不想在编译时计算一个纯函数,而是想在运行时计算它,该怎么办 例如: static int result = f(); f是一个纯函数,我希望它在运行时进行计算。仅供参考,并非所有纯函数都可以在编译时进行计算,纯函数并不要求在编译时运行。事实上,他们之间几乎没有什么关系 尝试对任何函数进行编译时函数求值,但仅当必须进行时。这是由上下文决定的-答案必须在编译时存在吗?以下情况也是如此: 枚举值 静态初始化器 静态if条件 静态foreach

我很好奇:如果有一个纯D函数,它可以在编译时计算

如果我不想在编译时计算一个纯函数,而是想在运行时计算它,该怎么办

例如:

static int result = f();

f
是一个纯函数,我希望它在运行时进行计算。

仅供参考,并非所有纯函数都可以在编译时进行计算,纯函数并不要求在编译时运行。事实上,他们之间几乎没有什么关系

尝试对任何函数进行编译时函数求值,但仅当必须进行时。这是由上下文决定的-答案必须在编译时存在吗?以下情况也是如此:

  • 枚举值
  • 静态初始化器
  • 静态if条件
  • 静态foreach参数
  • 模板参数
如果您因此希望在运行时调用它,只需在这些上下文之外调用它即可

static int result = f();
上面是一个静态初始值设定项,因此是CTFE


这不再是静态初始值设定项,因此不再是CTFE。为了防止它被调用两次,您可以使用一个特殊的值(表示它还没有运行)或一个单独的bool标志对它进行常规的
if
检查

如果在模块范围内,请使用构造函数:

static int result;
static this() { result = f(); }

仅供参考,并非所有纯函数都可以在编译时计算,纯函数并不要求编译时运行。事实上,他们之间几乎没有什么关系

尝试对任何函数进行编译时函数求值,但仅当必须进行时。这是由上下文决定的-答案必须在编译时存在吗?以下情况也是如此:

  • 枚举值
  • 静态初始化器
  • 静态if条件
  • 静态foreach参数
  • 模板参数
如果您因此希望在运行时调用它,只需在这些上下文之外调用它即可

static int result = f();
上面是一个静态初始值设定项,因此是CTFE


这不再是静态初始值设定项,因此不再是CTFE。为了防止它被调用两次,您可以使用一个特殊的值(表示它还没有运行)或一个单独的bool标志对它进行常规的
if
检查

如果在模块范围内,请使用构造函数:

static int result;
static this() { result = f(); }