未解决的导入:在`std::num`中没有`atan`。

3

我正在从 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


你正在使用哪个版本的 Rust?0.7?0.8-pre? - Kyle Sletten
我正在使用0.7版本。同时,我也在Windows系统上。 - Meta
1个回答

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()
    }
}

这是因为atanTrigonometric的成员,而float实现了Trigonometric。 这个决定的原因可能是Rust中没有重载机制,所以一个函数名要应用于多个具体类型,它必须是Trait的一部分。在这种情况下,Trigonometric是一个数值特性,允许intfloatf64等多种实现方法sincostan等。

教程过时了吗?还有,最好的 Rust 问题咨询地点在哪里? - Meta
Rust仍在积极开发中(主要版本<1),因此代码/文档变化很大,事情并不总是正确的。你也可能看到了过时的文档(我曾经意外地阅读了0.2版的文档)。你在哪里看到这个文档的? - Kyle Sletten
那看起来是文档中的一个错误。我已经向主分支提交了一个拉取请求:https://github.com/mozilla/rust/pull/8117 - Kyle Sletten
抱歉,看起来在0.8版本中std::num中有一个名为atan的函数,但在0.7版本中它必须没有被实现。 - Kyle Sletten
@Meta,提问的最佳场所是这里,#rust IRC和/或邮件列表。(#rust通常可以在几秒钟/几分钟内得到答案。) - huon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接