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