2017-05-08 57 views
1

我想弄清楚如何在本地聲明一個變量並在正在返回的值中使用它。以下是造成問題的原因如何返回一個使用本地聲明變量的結構的實例

use std::io; 
use std::string::String; 
use std::io::Write; // Used for flush implicitly 
use topping::Topping; 

pub fn read_line(stdin: io::Stdin, prompt: &str) -> String { 
    print!("{}", prompt); 
    let _ = io::stdout().flush(); 
    let mut result = String::new(); 
    let _ = stdin.read_line(&mut result); 
    return result; 
} 

pub fn handle_topping<'a>(stdin: io::Stdin) -> Topping<'a>{ 
    let name = read_line(stdin, "Topping name: "); 
    //let price = read_line(stdin, "Price: "); 
    return Topping {name: &name, price: 0.7, vegetarian: false}; 
} 

的代碼,我有以下結構作爲輔助

pub struct Topping<'a> { 
    pub name: &'a str, 
    pub vegetarian: bool, 
    pub price: f32, 
} 

編譯器會引發以下錯誤

error: `name` does not live long enough 
    --> src/helpers.rs:17:28 
    | 
17 |  return Topping {name: &name, price: 0.7, vegetarian: false}; 
    |       ^^^^ does not live long enough 
18 | } 
    | - borrowed value only lives until here 
    | 
note: borrowed value must be valid for the lifetime 'a as defined on the body at 14:58... 
    --> src/helpers.rs:14:59 
    | 
14 | pub fn handle_topping<'a>(stdin: io::Stdin) -> Topping<'a>{ 
    | ___________________________________________________________^ starting here... 
15 | |  let name = read_line(stdin, "Topping name: "); 
16 | |  //let price = read_line(stdin, "Price: "); 
17 | |  return Topping {name: &name, price: 0.7, vegetarian: false}; 
18 | | } 
    | |_^ ...ending here 

我不是特別想要改變結構,更願意得到一些關於我不瞭解的東西的建議。

+0

謝謝@Shepmaster指向正確的文章 –

回答

2

只需將Topping.name&str切換爲String即可。

您不能返回對read_line(a String)結果的引用,因爲String將在handle_topping的末尾丟失。但是,您可以將String的所有權移動到結構中並返回Topping {name: String, veg: bool, ...}