我正在构建Rust教程中的示例。当我尝试编译这个例子时:
use std::float;
use std::num::atan;
fn angle(vector: (float, float)) -> float {
let pi = float::consts::pi;
match vector {
(0f, y) if y < 0f => 1.5 * pi,
(0f, y) => 0.5 * pi,
(x, y) => atan(y / x)
}
}
我得到了名义错误。我正在使用rust build Test.rs
进行编译。为什么编译器找不到std::num::atan
?
答案 0 :(得分:3)
函数atan
不是std::num
的成员,因为它被定义为impl
的一部分。但是,以下内容可行:
use std::float;
fn angle(vector: (float, float)) -> float {
let pi = float::consts::pi;
match vector {
(0f, y) if y < 0f => 1.5 * pi,
(0f, y) => 0.5 * pi,
(x, y) => (y / x).atan()
}
}
这是因为atan
是Trigonometric
float
实施的成员。
我认为,这个决定的原因是Rust中没有重载,所以为了将函数名应用于多个具体类型,它必须是Trait的一部分。在这种情况下,Trigonometric
是一个数字特征,允许sin
,cos
的方法tan
,int
,float
等的多个实现},f64
等