2016-11-04 7 views
1

私は形質を使ってマトリックスを加えています。ジェネリック型の不一致に悩まされています。私のコードは次のとおりです。錆の中の形質を使った一般的なタイプの不一致

error[E0308]: mismatched types 
    --> src/main.rs:36:23 
    | 
36 |     sum = *num1 + *num2; 
    |      ^^^^^^^^^^^^^ expected i32, found type parameter 
    | 
    = note: expected type `i32` 
    = note: found type `T` 

error[E0308]: mismatched types 
    --> src/main.rs:41:9 
    | 
41 |   Matrix { 
    |  ^expected type parameter, found i32 
    | 
    = note: expected type `Matrix<T>` 
    = note: found type `Matrix<i32>` 

私の考え:

  1. num1ベクトルをDEREFと整数になるだろう

    use std::{ops, fmt}; 
    
    #[derive(PartialEq, Debug)] 
    pub struct Matrix<T> { 
        data: Vec<T>, 
        row: usize, 
        col: usize, 
    } 
    
    impl<T: Copy> Matrix<T> { 
        /// Creates a new matrix of `row` rows and `col` columns, and initializes 
        /// the matrix with the elements in `values` in row-major order. 
        pub fn new(row: usize, col: usize, values: &[T]) -> Matrix<T> { 
         Matrix { 
          data: values.to_vec(), // make copy and convert &[T] to vector type 
          row: row, 
          col: col, 
         } 
        } 
    } 
    
    impl<T: ops::Add<Output = T> + Copy> ops::Add for Matrix<T> { 
        type Output = Self; 
    
        /// Returns the sum of `self` and `rhs`. If `self.row != rhs.row || self.col != rhs.col`, panic. 
        fn add(self, rhs: Self) -> Self::Output { 
    
         assert!(self.col == rhs.col); 
         assert!(self.row == rhs.row); 
    
         let mut newdata = Vec::new(); // make a new vector to store result 
         let mut sum: i32; // temp variable to record each addition 
    
         for num1 in self.data.iter() { 
          for num2 in rhs.data.iter() { 
           sum = *num1 + *num2; 
           newdata.push(sum) 
          } 
         } 
    
         Matrix { 
          data: newdata, // finally, return addition result using new_data 
          row: self.row, 
          col: self.col, 
         } 
        } 
    } 
    
    fn main() { 
        let x = Matrix::new(2, 3, &[-6, -5, 0, 1, 2, 3]); 
        let y = Matrix::new(2, 3, &[0, 1, 0, 0, 0, 0]); 
        // z = x + y; 
    } 
    

    プログラムのコンパイル、私は型の不一致についての2つのエラーを得ましたそれで、結果を記録するために合計を使用するのです。

  2. 私は関数の最後にMatrix型の値を返そうとしています。

何が問題になりますか?

答えて

5

このコードは、メソッドの内部に頼ることができ、あなたの種類の全体知識である:それに基づいて

impl<T: ops::Add<Output = T> + Copy> ops::Add for Matrix<T> { 
    type Output = Self; 
    fn add(self, rhs: Self) -> Self::Output { 
     // ... 
    } 
} 

、どのようにこの仮定を作ることが可能だろうか?

num1 は整数型

具体的なタイプTが何であるか知る方法がありませんを取得ベクトルをDEREFと思います!

それ以外の場合は、一部の整数型であっても、i32の合計が許容されるとはどのように考えることができますか? Ti64の場合はどうなりますか?

解決策は、何らかの前提を取り除き、コンパイラにその仕事をさせることです。型注釈をsumから削除すると、コードがコンパイルされます。 常にに可能な限り私の型を推論させることをお勧めします。

も参照してください: