2016-11-13 7 views
0

投稿でeviloneが提供しているコードに触発されたHow to print a Vec?。マトリックスを表示するには、私は次のようなコードを書いた:forループを使用して行列を表示するときに、タイプが一致しない

use std::{ops, fmt}; 

#[derive(PartialEq, Debug)] 
pub struct Matrix<T> { 
    data: Vec<T>, 
    row: usize, 
    col: usize, 
} 

impl<T: Copy> Matrix<T> {  
    pub fn new(row: usize, col: usize, values: &[T]) -> Matrix<T> { 
     Matrix { 
      data: values.to_vec(), 
      row: row, 
      col: col, 
     } 
    } 
}  

//// Display 
impl<T: fmt::Display> fmt::Display for Matrix<T> { 

    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 
     let n_row = self.row; 
     let n_col = self.col; 
     let data = self.data; 

     for i in 0.. n_row { 
      let mut each_row = String::new(); 

      for j in 0.. n_col { 
       let idx = i * n_col + j; 
       let each_element = data[idx]; 
       each_row.push_str(&each_element.to_string()); 
       each_row.push_str(" "); // seperated by space 
      } 
      write!(f, "{}", each_row) 
     } 
    } 
}  

fn main() { 
    let x = Matrix::new(2, 3, &[-6, -5, 0, 1, 2, 3]); 
    println!("{}", x); 

} 

を、私はエラーを得た:

rustc 1.13.0 (2c6933acc 2016-11-07) 
error[E0308]: mismatched types 
    --> <anon>:40:13 
    | 
40 |    write!(f, "{}", each_row) 
    |    ^^^^^^^^^^^^^^^^^^^^^^^^^ expected(), found enum `std::result::Result` 
    | 
    = note: expected type `()` 
    = note: found type `std::result::Result<(), std::fmt::Error>` 
    = note: this error originates in a macro outside of the current crate 

error[E0308]: mismatched types 
    --> <anon>:31:9 
    | 
31 |   for i in 0.. n_row { 
    |  ^expected enum `std::result::Result`, found() 
    | 
    = note: expected type `std::result::Result<(), std::fmt::Error>` 
    = note: found type `()` 

1)私はexpected(), found enum `std::result::Result`

2を取得し、なぜ私は理解していない)第二のためにエラー、それは行40を実装する失敗によって引き起こされたと思った。したがって、行40を修正すれば、それはもはや問題にはなりません。

これを修正するための提案はありますか?

答えて

2

プログラミング時にMinimal, Complete, and Verifiable Exampleを作成すると便利です。これは、あなたが持っているエラーや問題に関連していないものすべてを削除し、純粋なエッセンスにまで煮詰めることを意味します。一般的に、このようにすると、問題の潜在的な場所が大幅に絞り込まれます。しばしば、これによってあなた自身が質問に答えることができますが、それ以外のときは洞察に満ちた質問をする機会が増えます。

は、ここでは、この問題のためにMCVEです:

fn foo() -> u8 { 
    for i in 0..1u8 { 
     i 
    } 
} 

fn main() {} 

かなり小さな、それはないですか?これらのエラーは次のとおりです。

error[E0308]: mismatched types 
--> src/main.rs:3:9 
    | 
3 |   i 
    |  ^expected(), found u8 
    | 
    = note: expected type `()` 
    = note: found type `u8` 

error[E0308]: mismatched types 
--> src/main.rs:2:5 
    | 
2 |  for i in 0..1u8 { 
    | ^expected u8, found() 
    | 
    = note: expected type `u8` 
    = note: found type `()` 

これはよくわかるはずです。

ここで質問することができます:forループはどのタイプと値ですか? (ヒント:コンパイラのメッセージ、実際にあなたがそれらに正しい方法を読めばあなたを伝える)

を私たちは関数がu8を返さなければならないことをを知ってが、コンパイラは、私たちが実際に()に戻ってきていることを教えてくれる - これは秒ですエラー。つまり、forループは()に評価されます。 forループは()と評価されるため、ループのブロックが評価する値に何が起こる可能性がありますか?あなたが推測できるように、答えはブロック値を返すことができないことです!

fn foo() -> u8 { 
    for i in 0..0u8 { 
     // 
    } 
} 

何だろうこのリターン:

この例を考えてみて?うん、おそらく何も良い。これは、単に他のエラーへの扉を開く

for /* ... */ { 
    // ... 

    try!(write!(f, "{}", each_row)) 
} 

Ok(()) 


元の問題に戻って私たちのMCVEからの復帰は、明示的に内部障害を返し、明示的にループの最後で成功を返す必要がありますコードでは、あなたはそれらを理解することが可能です!

+0

本当にありがとうございました。私は、エラー報告を深く見てMCVEのケースを作る方法を学ぶべきだということに全く同意します。私はこれらの日に闘争していて、ラストで多くのことを学んでいます。 – enaJ

+1

@enaJは頑張ってください!エラーを繰り返すケースを減らすことは、プログラミングのキャリア全体に役立つものです。 – Shepmaster

+0

間違いなく!私はPythonの背景から来て、6週間前にRustを学び始めました。彼らは多くの面でかなり異なっています。しかし、私は各言語が他の言語のより深い/より深いところを見るのに役立つと感じています。 – enaJ

関連する問題