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
提交了关于丑陋错误的文件