2017-04-10 4 views
2

私は非常に簡単な方法を持っています。最初の引数はベクトル成分( "A"、5、0)をとり、これを他のベクトルのすべての要素と比較して、同じ要素(_、5、_)を持つかどうかを調べ、見つかった要素の文字列を出力します。 ( "A"、5、0)と( "Q"、5、2)Q.生存期間指定子を修正するにはどうすればよいですか?

をプリントアウトする必要があり
fn is_same_space(x: &str, y1: i32, p: i32, vector: &Vec<(&str, i32, i32)>) -> (&str) { 
    let mut foundString = ""; 

    for i in 0..vector.len() { 

     if y1 == vector[i].1 { 
      foundString = vector[i].0; 
     } 

    } 
    foundString  
} 

を比較

はしかし、私は

error[E0106]: missing lifetime specifier 
--> src/main.rs:1:80 
    | 
1 | fn is_same_space(x: &str, y1: i32, p: i32, vector: &Vec<(&str, i32, i32)>) -> (&str) { 
    |                    ^expected lifetime parameter 
    | 
    = help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `x` or one of `vector`'s 2 elided lifetimes 
+1

ポイントは、あなたが誰か* *が所有しています '&str'を返していることです。コンパイラは誰が誰であるかを知りたいので、 '&str'が指し示すメモリがどれくらい長く生きるかが分かります。コンパイラに "'&str'を返すように伝える必要があります。渡される参照がある限り、 " – turbulencetoo

答えて

5

することにより、このエラーを取得します

fn is_same_space<'a>(x: &'a str, y1: i32, p: i32, vector: &'a Vec<(&'a str, i32, i32)>) -> (&'a str) 

これが唯一のあなたがかもしれない時間の多くの可能な解釈のである:寿命を指定それが機能するためのものであり、非常に控えめな選択です。参照されるすべてのパラメータの統一された存続期間を使用します。

おそらく、xの長さ、またはvectorの長さの文字列、またはvectorの文字列の長さの文字列を返したいとします。それらのすべてが潜在的に有効です。


私は強くあなたが戻ってをお勧めしますThe Rust Programming Languageを再読み込み。それは無料で初心者のRustを対象としており、Rustを独特なものにしてプログラマーにとっては新しいものすべてをカバーしています。多くの人がを本書に多くの時間を費やしてと書いてあります。このような初心者の質問にお答えします。


、私はイテレータを使用してコードを書き直したい:

fn is_same_space<'a>(y1: i32, vector: &[(&'a str, i32, i32)]) -> &'a str { 
    vector.iter() 
     .rev() // start from the end 
     .filter(|item| item.1 == y1) // element that matches 
     .map(|item| item.0) // first element of the tuple 
     .next() // take the first (from the end) 
     .unwrap_or("") // Use a default value 
} 
+0

ああ、ありがとうございます。私は本を​​読むべきであることを知っているが、私は最初にコードを実行し、後で男のタイプの質問をする。ご覧のように、私のタイプ推論は先延ばしです。私はそれが非常に悪い習慣であり、私の習慣を修正すべきだと分かっています。おかげです。 –

+0

@bossrevs:私は感情を知っている。 *構文*のページでページから始まるプログラミング言語の "本"を見ると、私は捨てる必要があるように感じます。それは退屈で、面白くない、私は行くように自然にこのものを選択します。しかし、新しい[Rust Book、2nd edition](http://rust-lang.github.io/book/secondedition/index.html)は異なっていますが、それは非常に実践的な体験であり、あなたが行っているような例があります。オーナーシップ/借り入れの章(2番目の肉の章)まで、少なくともそれをチェックすることをお勧めします。 –

2

上の冗長な括弧を削除するので、問題はvectorが2つの推論された寿命、vector自体(&Vec部分)用とベクトル内部&strのための1つを持っているという事実から来ています。 xにも推定寿命がありますが、それは本当に重要ではありません。

は、それを修正するだけで指定するには、その返さ &str命ある限り、ベクター中 &str:ここ

fn is_same_space<'a>(      // Must declare the lifetime here 
    x: &str,         // This borrow doesn't have to be related (x isn't even used) 
    y1: i32,         // Not borrowed 
    p: i32,         // Not borrowed or used 
    vector: &'a Vec<(&'a str, i32, i32)>  // Vector and some of its data are borrowed here 
) -> &'a str {        // This tells rustc how long the return value should live 
    ... 
} 
+1

'&Vec <(& 'a str、i32、i32)>'(またはより良い、 '&[(&' a str、i32、i32)] '、http://stackoverflow.com/q/40006219/155423 )十分でなければならない。容器の寿命は重要ではない。 – Shepmaster

+0

@Shepmaster提案していただきありがとうございます。代わりにスライスを使用することは考えていませんでした。私はまだかなり錆びていて、勉強しようとしています。私は質問に答えることで多くのハスケルを学んだことが分かるので、私は同じことをルストとするべきです。それはすでに働いているように見えます) – bheklilr

+0

「なぜ」へのリンクでコメントを更新しました。私は同じ理由でRustの質問に答えるようになったので、どこから来ているのか理解しています! – Shepmaster

関連する問題