Rust中trait绑定关联const按教程实现运行报错原因是什么?
问题根因
- 你遇到的两个报错是混淆泛型静态分发和trait对象动态分发的连锁反应:
你实现的fibonacci是泛型函数,返回值是实现了Floattrait的具体类型,而非trait对象。你直接把变量类型声明为Float时,编译器会默认你要创建trait对象,因此触发E0782错误要求你添加dyn关键字。 - 你添加
dyn后触发的E0038错误是Rust的trait对象安全规则限制:
Rust要求可被用作动态分发的trait必须满足对象安全要求,其中明确禁止trait包含关联常量。你的Floattrait定义了ZERO、ONE两个关联常量,天然不符合对象安全要求,不可能被声明为dyn Floattrait对象。
修复方案
你完全不需要使用trait对象,只要给变量指定具体的数值类型即可,两种写法都可正常编译:
- 给变量标注具体类型:
let fibonacci_of_3: f64 = fibonacci(3);
- 用涡轮鱼语法给泛型函数指定类型参数:
let fibonacci_of_3 = fibonacci::<f64>(3);
教程相关说明
并非教程内容过时,你大概率是误解了教程里的类型示意写法:教程里出现的Float类型标注一般是伪代码,仅用来表示返回值实现了该trait,并非让你直接抄写成变量的实际类型声明。
内容的提问来源于stack exchange,提问作者Marco Tulio Avila Cerón
相关产品推荐
相关产品推荐

