如何解决rust 无法返回阴影临时值得错误?
pub fn u8tostr (t: [u8;1024]) -> &'static str {
std::str::from_utf8(&t.clone()).unwrap()
} |
这里我传入一个u8的数组 然后把数组转为 str最后返回这个值。bSO华陈数据科技
error[E0515]: cannot return value referencing temporary value
--> src\main.rs:462:5
|
462 | std::str::from_utf8(&t.clone()).unwrap()
| ^^^^^^^^^^^^^^^^^^^^^---------^^^^^^^^^^
| | |
| | temporary value created here
| returns a value referencing data owned by the current function |
但 一直报错说 t 是临时创建的值 返回的一个值引用了临时的值!bSO华陈数据科技
一直搞不懂这是什么问题!bSO华陈数据科技
这是一个工具函数用来转换数组内的信息到文本 然后打印并返回值bSO华陈数据科技 bSO华陈数据科技 解决方法:bSO华陈数据科技 bSO华陈数据科技 bSO华陈数据科技
因为你无法通过没有所有权的变量来得到一个全局生命周期的引用呀...bSO华陈数据科技
算了,且让我教你一招:bSO华陈数据科技
bSO华陈数据科技 pub fn u8tostr(t: [u8; 1024] ) -> &'static str {bSO华陈数据科技 Box::leak(bSO华陈数据科技 String::from_utf8_lossy(&t).into_owned().into_boxed_str()bSO华陈数据科技 )bSO华陈数据科技 }bSO华陈数据科技 bSO华陈数据科技 bSO华陈数据科技 |
可应急用,风险自负 )bSO华陈数据科技 -------------------------------------------------------------------------------bSO华陈数据科技 bSO华陈数据科技 解决方法2:bSO华陈数据科技 bSO华陈数据科技 bSO华陈数据科技
报错信息很直白了... 你在尝试返回一个已释放对象的引用(野指针)bSO华陈数据科技
t.clone() 产生的临时变量仅在这行语句内生存,from_utf8 的返回值引用了它,所以也只在这行语句内生存,自然不能传到函数外面去bSO华陈数据科技
直接&t 也不行,t 是函数参数,只在函数体内生存,对它的引用也不能传出去bSO华陈数据科技
你可以传入引用,避免出现临时变量bSO华陈数据科技
pub fn u8tostr(t: &[u8; 1024]) -> &str {
std::str::from_utf8(&t).unwrap()
} |
或者返回一个 owned stringbSO华陈数据科技 bSO华陈数据科技
pub fn u8tostr(t: [u8; 1024]) -> String {
std::str::from_utf8(&t).unwrap().to_string()
} |
bSO华陈数据科技
|