为何用core::array::from_fn初始化数组时rng.gen()可用而rng.gen_range()不可用?
问题原因解析
这两段代码的核心差异在于闭包返回值的类型是否匹配from_fn的要求:
先明确
core::array::from_fn的约束
你要初始化的是[[f64; width]; length],意味着from_fn的闭包必须返回[f64; width]类型——因为外层数组的每个元素都是这个一维数组。rng.gen()能运行的原因rand库为数组类型(比如[f64; width])实现了Distributiontrait。当你调用rng.gen()时,编译器会自动推导需要生成[f64; width]类型的值,gen()会一次性生成整个一维数组,完全匹配闭包的返回类型要求。rng.gen_range(0.0..1.0)失败的原因gen_range的签名决定了它返回单个f64(你传入的范围是针对f64的),但闭包需要返回的是[f64; width]类型。类型不匹配,直接导致编译错误。
如果想用gen_range实现同样效果,需要让闭包返回一维数组,可以嵌套一层from_fn:
let array: [[f64; width]; length] = core::array::from_fn(|_| { core::array::from_fn(|_| rng.gen_range(0.0..1.0)) });
内容的提问来源于stack exchange,提问作者exocortex
相关产品推荐
相关产品推荐

