我有以下代码行,我希望它能正常工作:
const pi_n4th_root : f32 = Float::pi().powf(-1.0/4.0);
但它会产生以下错误:
f.rs:7:28: 7:54 error: the type of this value must be known in this context
f.rs:7 const pi_n4th_root : f32 = Float::pi().powf(-1.0/4.0);
^~~~~~~~~~~~~~~~~~~~~~~~~~
我尝试添加每种类型的注释:
const pi_n4th_root : f32 = (Float::pi() as f32).powf(-1.0/4.0 as f32) as f32;
但它仍然失败并出现同样的错误:
f.rs:7:30: 9:55 error: the type of this value must be known in this context
f.rs:7 const pi_m4th_root : f32 = (Float::pi::<f32>() as f32).powf(-1.0/4.0 as f32) as f32;
^~~~~~~~~~~~~~~~~~~~~~~~~
似乎我需要以某种方式指定为f32类型调用Float::pi
但是如何做到这一点?
答案 0 :(得分:2)
不幸的是,你想要做的事情由于两个原因而无法工作。
首先,你不能这样写:
const pi_n4th_root : f32 = Float::pi().powf(-1.0/4.0);
也就是说,你不能在常量定义中调用任何函数,因为编译器应该知道常量的精确值,而Rust还没有编译时功能评估。
其次,由于UFCS为not yet implemented,因此无法直接为某些特定类型调用特征方法。我不确定为什么Float::pi() as f32
不起作用,但您也无法在路径中指定所需的类型。唯一的方法是编写一个单独的函数:
#[inline]
pub fn pi<T: Float>() -> T { Float::pi() }
Rust标准库中有很多这样的功能。但是,对于Pi常数,有一种更好的方法 - 您可以直接使用适当类型的常量:
use std::f32;
let pi = f32::consts::PI;