2016-01-30 12 views
1

我想实现一个方法:如何在尝试实施方法时修复“错误的类型参数数量”?

struct Point<T> { 
    x: T, 
    y: T, 
} 

struct Line<T> { 
    start: Point<T>, 
    end: Point<T>, 
} 

impl Line { 
    fn length(&self) -> f64 { 
     let dx: f64 = self.start.x - self.end.x; 
     let dy: f64 = self.start.y - self.end.y; 
     (dx * dx + dy * dy).sqrt() 
    } 
} 

fn main() { 
    let point_start: Point<f64> = Point { x: 1.4, y: 1.24 }; 
    let point_end: Point<f64> = Point { x: 20.4, y: 30.64 }; 

    let line_a: Line<f64> = Line { 
     start: point_start, 
     end: point_end, 
    }; 
    println!("length of line_a = {}", line_a.length()); 
} 

我得到这个错误:

error[E0243]: wrong number of type arguments: expected 1, found 0 
    --> src/main.rs:11:6 
    | 
11 | impl Line { 
    |  ^^^^ expected 1 type argument 

是什么原因造成这个问题?

回答

2

你需要一个类型参数添加到IMPL:

impl Line<f64> { 
    fn length(&self) -> f64 { 
     let dx: f64 = self.start.x - self.end.x; 
     let dy: f64 = self.start.y - self.end.y; 
     (dx * dx + dy * dy).sqrt() 
    } 
} 
+0

所以这意味着,当我定义了一个类型,从这一点上我时,我用它来输入。 – user3419211

+1

@ user3419211 Rust可以在许多情况下推断出类型,但对于需要指定它的'impl'块和函数。这个特殊的'length'实现取决于'self.start.x'/etc。是'f64',所以你必须告诉Rust它只适用于那些。但是,你可以将这个类型从变量声明中删除(因为它已经存在于'impl'中,所以只需使用'let dx = ...'而不是'let dx:f64 = ...')。 – jkiiski

+0

@ user3419211嗯,它没有。你可以写'impl Line {...}'。但问题是,函数_that_泛型(实际上不依赖于类型“T”)可能是多么有用。它们可以是,但显然不是在你的特定情况下,因为你至少需要知道''T'来执行计算。 – kirelagin

相关问题