【问题标题】:How do I fix "wrong number of type arguments" while trying to implement a method?如何在尝试实现方法时修复“错误数量的类型参数”?
【发布时间】:2016-05-08 10:38:47
【问题描述】:

我正在尝试实现一个方法:

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

是什么导致了这个问题?

【问题讨论】:

    标签: methods rust implementation


    【解决方案1】:

    你需要给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()
        }
    }
    

    【讨论】:

    • 所以这意味着当我定义一个类型时,从那时起我必须在每次使用它时输入它。
    • @user3419211 Rust 可以在许多情况下推断类型,但对于 impl 块和函数,您需要指定它。 length 的特定实现取决于 self.start.x/etc。是f64,所以你必须告诉 Rust 它只适用于那些。但是,您可以将类型从变量声明中删除(仅使用 let dx = ... 而不是 let dx:f64 = ...),因为它已经存在于 impl 中。
    • @user3419211 好吧,它没有。你可以写impl&lt;T&gt; Line&lt;T&gt; { … }。但问题是,that 泛型(实际上不依赖于类型T)的函数有多大用处。它们可以是,但显然不是在您的特定情况下,因为您至少需要了解有关T一些信息 才能执行计算。
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2014-01-05
    • 1970-01-01
    • 2016-12-12
    • 2022-11-07
    • 2020-07-29
    相关资源
    最近更新 更多