Rust函数返回值报错:无法返回函数拥有的所有权值
Rust函数返回分割字符串向量的问题解决
问题根源
- 生命周期不匹配:函数声明返回
Vec<&'static str>,但foo.split(" ")生成的引用绑定到函数内部的局部变量foo,函数执行结束后foo会被销毁,这些引用就变成了悬空引用,Rust的安全机制禁止返回这类无效引用。 - 输入处理逻辑错误:
stdin().read_line(&mut ids_input)返回的Ok(n)是读取的字节数,并非用户输入的内容,你把这个数字转成字符串赋值给foo,相当于完全没拿到用户输入的罗马数字。
正确解决方案
将返回类型改为Vec<String>,让每个分割后的字符串拥有独立所有权,脱离局部变量的生命周期限制,同时修正输入处理逻辑:
use std::io; fn get_rotors() -> Vec<String> { println!("Enter a set of 3 Roman numerals separated by spaces.\nFor example: I IV VI"); let mut ids_input = String::new(); // 读取用户输入到ids_input中 if let Err(_) = io::stdin().read_line(&mut ids_input) { return Vec::new(); // 读取失败返回空向量 } // 去除输入首尾空白(含换行符),按任意空白分割后转成String收集为向量 ids_input.trim() .split_whitespace() .map(|segment| segment.to_string()) .collect() }
对之前错误尝试的解释
- 返回
*rotor_vec:Vec解引用后是[&str]切片,和函数声明的Vec<&'static str>类型不匹配,因此报错。 *rotor_vec.to_vec():to_vec()仅克隆原向量的引用,解引用后仍是切片,类型依然不匹配。- 使用
clone():克隆的是引用本身,未克隆底层字符串内容,无法解决生命周期问题。
内容的提问来源于stack exchange,提问作者NotAName
相关产品推荐
相关产品推荐

