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
切片,也不能仅与标准库类型一起存储)