为何使用变量指定StaticArray大小会报错?求解决方案
问题分析与解决办法
我来帮你拆解这个问题——这其实是Crystal语言里StaticArray的设计特性导致的,不是你写错了语法哦!
报错原因
Crystal 的 StaticArray 是编译时固定大小的数组类型,它的第二个类型参数(也就是数组的长度)必须是一个编译时常量——比如直接写的字面量3,或者用const关键字定义的常量。
你代码里的t是普通变量,哪怕你直接赋值3,编译器也不会把它当作编译常量处理。当解析StaticArray(Int32, t)时,编译器期望这里是一个常量值,结果看到的是变量标识符t,所以就抛出了Syntax error in eval:2: expecting token ')', not 't'的错误。
解决方法
根据你的实际需求,有两种可行方案:
方案1:如果数组大小可编译时确定,将t定义为常量
如果t的值在写代码时就已经确定(只是想复用这个值),可以把t定义成编译常量,让编译器能识别它:
const t = 3 seps = StaticArray(Int32, t).new{ 2 } seps.each{|i| p i}
方案2:如果数组大小需运行时动态指定,改用Array类型
如果t的值是运行时才能确定的(比如来自用户输入、计算结果等),StaticArray就不再适用了,应该用Crystal的动态数组Array:
t = 3 seps = Array(Int32).new(t, 2) seps.each{|i| p i}
这段代码会创建一个长度为t、所有元素都是2的动态数组,完全满足你用变量初始化数组的需求。
内容的提问来源于stack exchange,提问作者Mead
相关产品推荐
相关产品推荐

