2017-12-11 16 views
0

汎用構造体を返したいと思います。私は実際の実装の出力を標準に従ってSTDINに出力したいのですが、テスト目的のために、それをベクトルなどで置き換えて出力を簡単にテストすることができます。私がこれまで持っているソリューションです:私は取得しています新しい構造体からの汎用構造体の返却

#[derive(Debug)] 
pub struct Sender<R, W> { 
    pub reader: R, 
    pub writer: W, 
} 

#[derive(Debug)] 
pub struct Sender<R, W> { 
    pub reader: R, 
    pub writer: W, 
} 

impl<R, W> Sender<R, W> { 
    pub fn new<R, W>(reader: R, writer: W) -> Sender<R, W> { 
     Sender { 
      reader: R, 
      writer: W, 
     } 
    } 
} 

エラー:

error[E0423]: expected value, found type parameter `R` 
    --> src/main.rs:10:21 
    | 
10 |    reader: R, 
    |     ^not a value 

error[E0423]: expected value, found type parameter `W` 
    --> src/main.rs:11:21 
    | 
11 |    writer: W, 
    |     ^not a value 

error[E0601]: main function not found 

error[E0194]: type parameter `R` shadows another type parameter of the same name 
--> src/main.rs:8:16 
    | 
7 | impl<R, W> Sender<R, W> { 
    |  - first `R` declared here 
8 |  pub fn new<R, W>(reader: R, writer: W) -> Sender<R, W> { 
    |    ^shadows another type parameter 

error[E0194]: type parameter `W` shadows another type parameter of the same name 
--> src/main.rs:8:19 
    | 
7 | impl<R, W> Sender<R, W> { 
    |   - first `W` declared here 
8 |  pub fn new<R, W>(reader: R, writer: W) -> Sender<R, W> { 
    |     ^shadows another type parameter 

これは私には理にかなって、それはRの具体的な種類を知りません。でも、私はことを解決できない関数で、一般的なパラメータを与えて考え出したが、それは、この追加のエラー与える:new<R, W>ので動作しません

34 | impl<R, W> Sender<R, W> { 
    |   - first `R` declared here 
35 | pub fn new<R, W>(reader: R, writer: W) -> Sender<R, W> { 
    |   ^shadows another type parameter 

を宣言し異なる(ただし、同じ名前!)RW

私は2つの異なるnew関数を作成する必要はありませんが、メモリ読み書き用とSTDIN読み書き用の2つの方法がありますか?

答えて

3

私はあなたが構造体を初期化するために使用される構文を誤解するかもしれないと思う - それは立っているとして、あなたの関数は、あなたが渡しているパラメータ、RWに構造体のreaderwriterフィールドを設定していないしようとしています!

それは次のようになります。構造体のフィールドとあなたのパラメータが同じ名前、you can also use the field init shorthand syntax持っているので

impl<R, W> Sender<R, W> { 
    pub fn new(reader: R, writer: W) -> Sender<R, W> { 
     Sender { 
      reader: reader, // field name on the left, value on the right 
      writer: writer, 
     } 
    } 
} 

impl<R, W> Sender<R, W> { 
    pub fn new(reader: R, writer: W) -> Sender<R, W> { 
     Sender { reader, writer } 
    } 
} 

をお持ちでない場合、私はChapter 5 of 'The Rust Programming Language'を読んでお勧めします - それはすべてのものをカバーします。