Methods 从特性实现静态方法时的名称解析错误

Methods 从特性实现静态方法时的名称解析错误,methods,static,rust,traits,Methods,Static,Rust,Traits,以下是教程中稍作修改的示例: use std::f64::consts::PI; trait Awesome { fn how_awesome() -> int; } struct Circle { radius: f64 } impl Circle { fn area(&self) -> f64 { self.radius * self.radius * PI } fn new(area: f64) -> Circle { Circle { r

以下是教程中稍作修改的示例:

use std::f64::consts::PI;

trait Awesome {
  fn how_awesome() -> int;
}

struct Circle { radius: f64 }
impl Circle {
    fn area(&self) -> f64 { self.radius * self.radius * PI }
    fn new(area: f64) -> Circle { Circle { radius: (area / PI).sqrt() } }
}


impl Awesome for Circle {
    fn how_awesome() -> int { 5 }
}

fn main() {
    let c = Circle::new(42.5); // fine
    let c2 = Circle::how_awesome(); // error: unresolved name `Circle::how_awesome`.
}
甚至比这更奇怪:

struct Point {
  x: f64,
  y: f64
}

impl Awesome for Point {
    fn how_awesome() -> int { 3 }
}

fn main() {
    let p = Point::how_awesome();
}
导致

ERROR:rustc::middle::resolve: !!! (resolving module in lexical scope) module wasn't actually a module!
type.rs:41:11: 41:25 error: unresolved name
type.rs:41   let p = Point::how_awesome();
                     ^~~~~~~~~~~~~~
type.rs:41:11: 41:25 error: use of undeclared module `Point`
type.rs:41   let p = Point::how_awesome();
                     ^~~~~~~~~~~~~~
ERROR:rustc::middle::resolve: !!! (resolving module in lexical scope) module wasn't actually a module!
type.rs:41:11: 41:25 error: unresolved name `Point::how_awesome`.
type.rs:41   let p = Point::how_awesome(); 
                     ^~~~~~~~~~~~~~
我每天晚上都在用相当新鲜的:

rustc 0.11.0-pre-nightly (db5ca23 2014-05-14 01:06:24 -0700)
host: x86_64-unknown-linux-gnu

搜索这个问题完全没有什么坏处。

目前,所有方法都有各自的特点,包括静态方法。在实现之前,您需要调用trait本身:

let p = Awesome::how_awesome();
然而,编译器需要某种方法来精确计算应该使用该特性的哪种实现,即,某种方法来推断
的RHS上的类型,以便找到特定的
impl
。如前所述,
how_awesome
方法根本没有提到这个
Self
类型,因此编译器无法直接推断它(比如with,可以像
let x:type=Default::Default();

应该有一种手动指定的方法,但我们目前没有。这也是UFCS RFC所涵盖的内容,目前唯一的解决方法是类似以下的黑客攻击:

struct Point {
  x: f64,
  y: f64
}

trait Awesome {
    fn how_awesome(_ignored: Option<Self>) -> int;
}

impl Awesome for Point {
    fn how_awesome(_ignore: Option<Point>) -> int { 0 }
}

fn main() {
    let p = Awesome::how_awesome(None::<Point>);
}
结构点{
x:f64,
y:f64
}
特质真棒{
fn how_awesome(_忽略:选项)->int;
}
这一点令人敬畏{
fn how_awesome(_ignore:Option)->int{0}
}
fn main(){
让p=Awesome::how_Awesome(无:);
}

我为
Point::how_awesome
提交了关于丑陋错误的文件