2016-07-18 10 views
0

タイプOption<&str>のバインディングを作成できますか?小型非作業例:は、私はタイプ `オプション<&str>`との結合を作成することはできますか?

fn main() { 
    let a: Option<&str> = { 
     Some(&{"a".to_string() + "b"}) // Let's say the string is not static 
    }; 
} 

これは動作しません、私は一生を追加(または&なしOption<String>を使用)する必要があります。だから私はここで生涯を宣言できますか?私はOption<String>を返すことができ、すべてがうまくいくとは知っていますが、それは私が欲しいものではありません - 私はいくつかのRustの仕組みを理解しようとしています。私は関数内で生涯宣言できますが、単純なletバインディングでこれを行う方法はわかりません。

答えて

2

は絶対に:

fn main() { 
    let s = "a".to_string() + "b"; 
    let a: Option<&str> = Some(&s); 
} 

問題ではありませんOption<&str>を作成するには、それはあなたがスコープ外になった何かへの参照を取るしようとしているということです。これは、元のコードのエラーメッセージ(の一部):

error: borrowed value does not live long enough 
    |>   Some(&{"a".to_string() + "b"}) 
    |>    ^^^^^^^^^^^^^^^^^^^^^^^ does not live long enough 

は詳細についてReturn local String as a slice (&str)を参照してください。

1

あなたが別の名前にそれを結合することによってaの初期化子式を超えて文字列の寿命を延長する必要があります。

fn main() { 
    let x: String = "a".to_string() + "b"; 
    let a: Option<&str> = { 
     Some(&x) 
    }; 
} 
1

あなたが好きな、十分な長さ住んでいない値への参照を保持しようとしています

3 |>   Some(&{"a".to_string() + "b"}) // Let's say the string is not static 
    |>    ^^^^^^^^^^^^^^^^^^^^^^^ does not live long enough 

あなたがタイプOption<&str>のバインドを持つことができますが、参照は、バインドよりも長生きする必要があります。エラーは述べています。あなたの例では、結果の文字列へのバインドを作成します。それよりも先に参照してください:

fn main() { 
    let x: String = "a".to_string() + "b"; 
    let a: Option<&str> = Some(&x); 
} 
関連する問題