为何Nim语言for循环中索引i无法在编译时求值?
Nim编译报错原因及解决办法
错误核心原因
Nim里的const要求变量的值必须在编译阶段就能完全确定,而你写的普通for循环里的i是运行时才会赋值的变量——编译器在编译阶段根本不知道每次循环的i具体是多少,自然没法用它计算出const ss的确定值,所以抛出了Error: cannot evaluate at compile time: i的错误。
而你去掉循环的代码能正常运行,是因为直接用了常量10调用repeat,这个值在编译期是明确的,编译器可以直接算出s.repeat(10)的结果,用来初始化const ss完全没问题。
解决办法
1. 去掉不必要的const(最常用)
如果只是想在循环里输出重复的字符串,不需要把ss声明为const,改用let(不可变变量)或者直接调用echo就行,运行时求值完全支持:
import std/strutils const s = "a" for i in 1..10: let ss = s.repeat(i) echo ss
更简洁的写法:
import std/strutils const s = "a" for i in 1..10: echo s.repeat(i)
2. 用编译期循环(staticFor)
如果确实需要在编译阶段处理这个循环(比如生成编译期常量供后续使用),可以用Nim的staticFor,它的循环变量是编译期常量,能满足const的求值要求:
import std/strutils const s = "a" staticFor i in 1..10: const ss = s.repeat(i) echo ss
这种写法下,所有的ss都会在编译阶段生成,运行时直接输出预计算好的结果。
内容的提问来源于stack exchange,提问作者lelate
相关产品推荐
相关产品推荐

