2017-05-19 10 views
0

構造体に文を保存しようとしていて、あらかじめ初期化する必要があります。そうしないと、構造体はmatch文の内部では認識されません(さらにコードlet data = ...を参照)。複数の呼び出しで構造体の変数を保存および取得するにはどうすればよいですか?

関数を2回呼び出すと(fn mainの部分に示されているように)、以前に保存された文を既定の初期化された構造体で上書きし、代わりにそれを返します。

安全でないグローバル変数を使用せずに "RET"の一致ステートメント内にその文を保存しておく方法はありますか?

#[derive(Default)] 
struct Test { 
    satz: String, 
} 

impl Test { 
    pub fn testing(message: &str) -> Result<Option<String>, &'static str> { 
     let mut vs: Vec<&str> = message.split(' ').collect(); 
     let mut i = 0; 
     while vs[i] != "\n" { 
      i += 1; 
      if i > vs.len() { 
       Err("wrong format.").unwrap() 
      } 
     } 
     vs.truncate(i); 
     let data: Test = Default::default(); 
     match vs[0] { 
      "PUB" => { 
       let data = Test { satz: vs.join(" ") }; 
       Ok(None) 
      } 
      "RET" => { 
       let x = data.satz; 
       Ok(Some(x)) 
      } 
      _ => Err("wrong format.") 
     } 
    } 
} 

fn main() { 
    Test::testing("PUBLISH Hey this is a short message! \n"); 
    let a = Test::testing("RETRIEVE \n").unwrap().unwrap(); 
    println!("{:?}", a); 
} 
+0

のようにそれを記述します:これは、大学や学校の割り当てのですか?もしそうなら、どの大学/学校ですか?^_^ –

+3

あなたの質問について:私は残念ながら、あなたのプログラムが何をすべきか理解していません。 'PUB'と' PUBLISH'が混在しているので、今すぐパニックになります。しかしあなたの説明から、これはあなたが話している問題ではないようですので、私たちが主な問題に集中できるようにパニックを修正してください。しかし、もう一度:私はあなたが達成しようとしていることをよく分かりません。 1つのメソッドでゲッター/セッターを使いたいですか?これらのことを明確にするためにあなたの質問を修正してください、ありがとう:) –

答えて

2

あなたがどこでどのようにデータが格納されている程度の非常に混乱しているようだ

以前に保存された文。私はあなたがThe Rust Programming Languageを再読み込みすることを強くお勧めします。この具体的なケースでは、methodsまでの再読み取りには細心の注意が必要です。

明らかに、Test::testingにはデータを保存する場所がありません。インスタンスごとのデータにアクセスするメソッドには、self引数があります。 Test::testingは、関連機能であり、メソッドではありません。関数に&mut selfを追加

はそれメソッドになり、その後、selfdataのすべての使用を置き換える:コンパイラは、何かが間違っていたことを伝えるためにしようとしたこと

#[derive(Default)] 
struct Test { 
    satz: String, 
} 

impl Test { 
    pub fn testing(&mut self, message: &str) -> Result<Option<String>, &'static str> { 
     let mut vs: Vec<_> = message.split(' ').collect(); 
     let mut i = 0; 
     while vs[i] != "\n" { 
      i += 1; 
      if i > vs.len() { 
       Err("wrong format.").unwrap() 
      } 
     } 
     vs.truncate(i); 

     match vs[0] { 
      "PUB" => { 
       self.satz = vs.join(" "); 
       Ok(None) 
      } 
      "RET" => { 
       Ok(Some(self.satz.clone())) 
      } 
      _ => Err("wrong format.") 
     } 
    } 
} 

fn main() { 
    let mut t = Test::default(); 
    t.testing("PUB Hey this is a short message! \n").unwrap(); 
    let a = t.testing("RET \n").unwrap().unwrap(); 
    println!("{:?}", a); 
} 

注:

warning: unused variable: `data` 

dataには、関数呼び出しを超えて持続できるような特別な意味があると思います。そのようなことはありません。データがどこに格納されているのか明示されていなくても、関数全体を持続すると、となり、多くの理由から望ましくありません。何かが失敗することはできません場合は

また、あなたexpect(またはあなたがしなければならない場合は、unwrap)を呼び出し、

warning: unused result which must be used 

のような警告を、無視するべきではありません。


FWIWあなたがドイツ語を話すように見えるように、私は今、私は好奇心が強い、

impl Test { 
    pub fn testing(&mut self, message: &str) -> Result<Option<String>, &'static str> { 
     let message = message.trim(); 
     let mut parts = message.splitn(2, " "); 

     match parts.next() { 
      Some("PUB") => { 
       let msg = parts.next().ok_or("wrong format.")?; 
       self.satz = msg.to_owned(); 
       Ok(None) 
      } 
      Some("RET") => { 
       Ok(Some(self.satz.clone())) 
      } 
      _ => Err("wrong format.") 
     } 
    } 
} 
関連する問題