Rust:“在此上下文中必须知道此值的类型”Float :: pi的错误

时间:2014-11-01 10:07:13

标签: rust type-inference

我有以下代码行,我希望它能正常工作:

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但是如何做到这一点?

1 个答案:

答案 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;

你可以找到常量列表herehere(如果页面本身为空,你可以按[src]链接,似乎是Rustdoc中的一个错误。)