String 在知道字符串需要多大之前,如何分配字符串

String 在知道字符串需要多大之前,如何分配字符串,string,rust,lifetime,String,Rust,Lifetime,我相信这是初学者的错误。我的代码是: ... let mut latest_date : Option<Date<Local>> = None; let mut latest_datetime : Option<DateTime<Local>> = None; let mut latest_activity : Option<&str> = None; for wrapped_line in reader.lines() {

我相信这是初学者的错误。我的代码是:

...
let mut latest_date : Option<Date<Local>> = None;
let mut latest_datetime : Option<DateTime<Local>> = None;
let mut latest_activity : Option<&str> = None;

for wrapped_line in reader.lines() {
    let line = wrapped_line.unwrap();
    println!("line: {}", line);

    if date_re.is_match(&line) {
        let captures = date_re.captures(&line).unwrap();
        let year = captures.at(1).unwrap().parse::<i32>().unwrap();
        let month = captures.at(2).unwrap().parse::<u32>().unwrap();
        let day = captures.at(3).unwrap().parse::<u32>().unwrap();
        latest_date = Some(Local.ymd(year, month, day));
        println!("date: {}", latest_date.unwrap());
    }

    if time_activity_re.is_match(&line) && latest_date != None {
        let captures = time_activity_re.captures(&line).unwrap();
        let hour = captures.at(1).unwrap().parse::<u32>().unwrap();
        let minute = captures.at(2).unwrap().parse::<u32>().unwrap();
        let activity = captures.at(3).unwrap();

        latest_datetime = Some(latest_date.unwrap().and_hms(hour, minute, 0));

        latest_activity = if activity.len() > 0 {
            Some(activity)
        } else {
            None
        };

        println!("time activity: {} |{}|", latest_datetime.unwrap(), activity);
    }
}
...
。。。
让mut latest_date:Option=None;
让mut latest_datetime:Option=None;
让mut最新_活动:选项=无;
对于reader.lines()中的换行{
让线=包裹线。展开();
println!(“行:{}”,行);
如果日期匹配(&行){
let captures=date_re.captures(&line).unwrap();
let year=captures.at(1).unwrap().parse::().unwrap();
let month=captures.at(2).unwrap().parse::().unwrap();
let day=captures.at(3).unwrap().parse::().unwrap();
最近日期=一些(Local.ymd(年、月、日));
println!(“日期:{}”,最新的_date.unwrap());
}
如果时间活动匹配(&line)&最新日期!=无{
let captures=time\u activity\u re.captures(&line).unwrap();
let hour=captures.at(1).unwrap().parse::().unwrap();
let minute=captures.at(2).unwrap().parse::().unwrap();
let activity=captures.at(3).unwrap();
latest_datetime=Some(latest_date.unwrap()和_hms(小时、分钟、0));
最新活动=如果活动.len()大于0{
一些(活动)
}否则{
没有一个
};
println!(“时间活动:{}}{}}}{}}},最新的日期时间.unwrap(),活动);
}
}
...
我的错误是:

   Compiling tt v0.1.0 (file:///home/chris/cloud/tt)
src/main.rs:69:55: 69:59 error: `line` does not live long enough
src/main.rs:69             let captures = time_activity_re.captures(&line).unwrap();
                                                                     ^~~~
src/main.rs:55:5: 84:6 note: in this expansion of for loop expansion
src/main.rs:53:51: 86:2 note: reference must be valid for the block suffix following statement 7 at 53:50...
src/main.rs:53     let mut latest_activity : Option<&str> = None;
src/main.rs:54 
src/main.rs:55     for wrapped_line in reader.lines() {
src/main.rs:56         let line = wrapped_line.unwrap();
src/main.rs:57         println!("line: {}", line);
src/main.rs:58 
               ...
src/main.rs:56:42: 84:6 note: ...but borrowed value is only valid for the block suffix following statement 0 at 56:41
src/main.rs:56         let line = wrapped_line.unwrap();
src/main.rs:57         println!("line: {}", line);
src/main.rs:58 
src/main.rs:59         if date_re.is_match(&line) {
src/main.rs:60             let captures = date_re.captures(&line).unwrap();
src/main.rs:61             let year = captures.at(1).unwrap().parse::<i32>().unwrap();
               ...
error: aborting due to previous error
Could not compile `tt`.
编译tt v0.1.0(file:///home/chris/cloud/tt)
src/main.rs:69:55:69:59错误:'line'的寿命不够长
src/main.rs:69 let captures=time_activity_re.captures(&line).unwrap();
^~~~
src/main.rs:55:5:84:6注:在此for循环扩展的扩展中
src/main.rs:53:51:86:2注:引用必须对53:50处语句7后面的块后缀有效。。。
src/main.rs:53让mut最新活动:Option=None;
src/main.rs:54
src/main.rs:55用于reader.lines()中的换行{
src/main.rs:56 let line=wrapped_line.unwrapp();
src/main.rs:57 println!(“行:{}”,行);
src/main.rs:58
...
src/main.rs:56:42:84:6注意:…但借用值仅对56:41处语句0后面的块后缀有效
src/main.rs:56 let line=wrapped_line.unwrapp();
src/main.rs:57 println!(“行:{}”,行);
src/main.rs:58
src/main.rs:59如果日期匹配(&行){
src/main.rs:60 let captures=date_re.captures(&line).unwrap();
src/main.rs:61 let year=captures.at(1).unwrap().parse::().unwrap();
...
错误:由于上一个错误而中止
无法编译'tt'。
我认为问题在于
latest\u activity:Option
在循环迭代中的寿命比
line
长,其中
latest\u activity
被重新分配

正确吗

如果是这样的话,最好的修复方法是什么?分配新字符串的成本并不困扰我,尽管我不希望每次迭代都这样做

我觉得我可能需要一个参考计数框来放入
活动
——这是正确的方法吗


我可以在循环之外分配一个
字符串
,但是在我知道它需要有多大之前,我怎么能这样做呢?

问题是您已经在为每一次迭代分配一个新字符串(因为
迭代器没有地方存储缓冲区,所以它必须为每一行分配一个新的
字符串
),但您正在尝试将一个切片存储到循环外部

在这种情况下,您也无法真正知道外部分配的
字符串需要有多大……因此通常您不必担心它,只需根据需要调整大小即可

最简单的方法可能是将
latest\u activity
设为
选项
。当您想要更改它时,可以使用
.clear()
后跟
.push\u str
(请参阅)。如果现有分配足够大,则应重新使用,如果不够大,则应调整其大小。这可能需要重新分配,但不需要太多(例如,如果您不尝试存储越来越长的字符串)

另一种可能是只存储
包装行
本身,将其移出循环。您可以将其与切片索引一起存储,然后在循环外部执行实际切片(不,您不能仅单独存储
字符串
&str
切片,也不能仅与标准库类型一起存储)