2017-12-11 6 views
0

Ich möchte eine generische Struktur zurückgeben. Die Idee ist, dass ich die tatsächliche Implementierung nach STDIN nach dem Standard ausgeben lassen möchte, aber zu Testzwecken möchte ich sie durch einen Vektor oder etwas anderes ersetzen, damit ich die Ausgabe einfach testen kann. Die Lösung, die ich bisher habe, ist:Zurückgeben einer generischen Struktur von neuen

#[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, 
     } 
    } 
} 

Die Fehler Ich erhalte:

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 

Dies macht Sinn für mich, ist es nicht die konkrete Art der R kennen. Ich dachte, die allgemeinen Parameter in der Funktion geben würde, dass, obwohl gelöst haben, aber das gibt diesen zusätzlichen Fehler:

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 

Das ist nicht, weil new<R, W> funktioniert erklärt ein verschiedene (aber gleichen Namen!) R und W .

Gibt es eine Möglichkeit, dies zu tun, die mich nicht erfordert, zwei verschiedene new Funktionen zu machen, eine für Speicher lesen/schreiben und die andere für STDIN lesen/schreiben?

Antwort

3

Ich glaube, Sie können die Syntax verwendet werden Missverständnisse structs zu initialisieren - wie es steht, Ihre Funktion die reader und writer Felder der Struktur zu R und W, nicht die Parameter zu setzen versucht, die Sie vorbei an!

Es sollte wie folgt aussehen:

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, 
     } 
    } 
} 

Da die Struktur Feld und Ihre Parameter die gleichen Namen haben, 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, writer } 
    } 
} 

Ich empfehle Chapter 5 of 'The Rust Programming Language' lesen würde, wenn Sie nicht bereits haben - Es deckt all diese Dinge ab.

Verwandte Themen