2017-02-15 8 views
1

&strの変数入力を更新したいと思います。内部関数をCowではなく&strに戻すにはどうすればよいですか?std :: borrow :: Cowの代わりに&strを返す<'_, str>

これは言語には問題ありませんが、regex-crateでは問題はありません。もっと簡単なものはありますか?

fn transform_the_expression() { 

    fn create_formula<'t>(input: &'t str, re: Regex) -> std::borrow::Cow<'t, str> { 
     let changed_string = re.replace(input, "1"); 
     return changed_string; 
    } 

    let mut input = "(a+(b*c))"; 
    use regex::Regex; 
    let re = Regex::new(r"\([\w\d][/*+-^][\w\d]\)").unwrap(); 

    println!("input = {:?}", input); 
    input = create_formula(input, re); 
    println!("input = {:?}", input); 
} 
+0

なぜですか?それを逆参照することによって 'Cow'からリファレンスを得ることができます。 – ljedrz

+0

@ ljedrz:おそらく 'input = create_formula(input、re);'が働くようになるでしょう。 –

答えて

7

あなたすることはできません。


錆の礎石は、あなたが理解する必要がある概念です所有、です。

&strを借りなく自身を行い、それが他の誰かが所有しているメモリの一部を指します。借用チェッカーは、コンパイル時に、参照されるメモリを所有する人がより長く、よりも長くなるようにします。それ以外の場合は&strがエーテルを指します。この場合

は、考える:

  • String(小型カメラ無人機が続く)この猫のライブフィードを実行するハンドヘルド装置である猫
  • &strある

もちろん、あなただけであれば

...、その後、に住ん と猫のライブフィードを持つことができます3210

あなたの質問には次のような質問があります:

私が猫を殺すと、どうすればライブフィードが得られますか?

できません。あなたのケースでは


re.replaceCow<'t, str>を作成します。あなたがCowの定義を見れば、あなたはそれがあることがわかります:

  • いずれか&str
  • またはString

それはある&strのみ代替はありませんが発生しなかった場合、およびそれ以外の場合はStringです。

静的にはそれを知ることができないので、「最悪の場合」の選択肢を検討する必要があります。Stringと考えてください。

この生涯は何ですか:あなたが関数から返すかどうかによって異なります。そうでない場合、関数のフレームよりも長生きすることはできません。

機能フレームよりも長生していない場合は、機能フレームよりも長生きするライブフィードを作成することはできません。


だから?

私の助言はStringです。それはずっと簡単になるでしょう:

fn transform_the_expression() { 
    use regex::Regex; 

    fn create_formula(input: &str, re: &Regex) -> String { 
     re.replace(input, "1").into() 
    } 

    let mut input = String::from("(a+(b*c))"); 
    let re = Regex::new(r"\([\w\d][/*+-^][\w\d]\)").unwrap(); 

    println!("input = {:?}", input); 
    input = create_formula(&input, &re); 
    println!("input = {:?}", input); 
} 
+0

ありがとう、とても助かりました。関数into()は廃止され、into_owned()に置き換えられているようですが、少なくともborrows.rsには含まれていません。 –

+2

関数 'into'は、自動的に実装されるため、見つけるのが少し難しいです。 'std :: convert :: From'とその悪い双子' std :: convert :: Into'をチェックアウトすることをお勧めします: 'X :: from(Y) - > X'の実装では、 'Y :: into(self) - > X'は自動的に魔法にかかります。 –

関連する問題