前提
商品一覧CSV から、指定した id をもつ行を検索するプログラムを作っています。
現在、検索結果がもつ文字列から商品を表すオブジェクトを生成し、それを関数の戻り値にようとしています。
実現したいこと
コンパイルエラーを解消し、 find_by_id
が Marchant
を返すようにしたいです。
発生している問題・エラーメッセージ
Compiling playground v0.0.1 (/playground) error[E0515]: cannot return value referencing local variable `r` --> src/main.rs:47:9 | 35 | let name = &r[1]; | - `r` is borrowed here ... 47 | found | ^^^^^ returns a value referencing data owned by the current function For more information about this error, try `rustc --explain E0515`. error: could not compile `playground` due to previous error
該当のソースコード
rust
1use csv; 2 3/// 商品 4struct Marchant<'a> { 5 id: &'a str, // id 6 name: &'a str, // 名前 7 price: i32, // 価格 8} 9 10impl<'a> Marchant<'a> { 11 fn new(id: &'a str, name: &'a str, price: i32) -> Self { 12 Self { id, name, price} 13 } 14} 15 16/// 商品検索機 17struct MarchantFinder<'b> { 18 /// CSV 19 csv_reader: csv::Reader<&'b [u8]>, 20} 21 22impl<'b> MarchantFinder<'b> { 23 24 /// CSV から、指定した id を持つ商品を取得する 25 fn find_by_id<'a>(&'a mut self, id: &'a str) -> Option<Marchant> { 26 let mut found: Option<Marchant> = None; 27 28 // csv から id を探す 29 for record in self.csv_reader.records() { 30 found = match record { 31 Ok(r) => { 32 let current_id = &r[0]; 33 if current_id == id { 34 // id が見つかった場合、その行の 名前 と 価格 から 商品を生成する 35 let name = &r[1]; 36 let price = (&r[2]).parse().unwrap(); 37 let marchant = Marchant::new(id, name, price); 38 found = Some(marchant); 39 } 40 found 41 } 42 Err(_) => { // id が見つからなかった場合 43 None 44 } 45 }; 46 } 47 found 48 } 49} 50 51fn main() { 52 let str_csv = "id,name,price 53 101,Apple,150 54 102,Orange,80, 55 103,Banana,30"; 56 let reader = csv::Reader::from_reader(str_csv.as_bytes()); 57 let mut finder = MarchantFinder { csv_reader: reader }; 58 59 let id = "102"; // 検索対象の id 60 match finder.find_by_id(id) { 61 Some(marchant) => { 62 println!("id: {}, name:{} price:{}", id, marchant.name, marchant.id); 63 } 64 None => { 65 println!("id: No marchant"); 66 } 67 }; 68} 69
補足情報(FW/ツールのバージョンなど)
Build using the Stable version: 1.62.1
どうぞよろしくお願いいたします。

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/07/23 21:34
2022/07/23 23:03