我的代码简化版本如下所示:
fn main() {
method1(true);
}
fn method1(cond: bool) -> (&[u8], String) {
let ret1 = if cond {
let a = "a string in base64".as_bytes().from_base64();
a.unwrap().as_slice()
} else {
[] // how can I return an empty array? Should I return vector instead?
};
(ret1, "aaa".to_string())
}
错误:
error: missing lifetime specifier [E0106]
test1.rs:7 fn method1(cond: bool) -> (&[u8], String) {
^~~~~
test1.rs:7:28: 7:33 help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
test1.rs:7 fn method1(cond: bool) -> (&[u8], String) {
^~~~~
test1.rs:7:28: 7:33 help: consider giving it a 'static lifetime
test1.rs:7 fn method1(cond: bool) -> (&[u8], String) {
^~~~~
error: aborting due to previous error
底线是,我想从一个方法返回一个数组的元组和一个字符串(String或& str),我该怎么做?
答案 0 :(得分:6)
你不能。
你可以这样做:
fn main() {
method1(true);
}
fn method1(cond: bool) -> (&'static [u8], String) {
// ' <-- un-confuse SO syntax highlighting...
let ret1 = if cond {
b"some hard-coded data"
} else {
b""
};
(ret1, "aaa".to_string())
}
注意:
b"..."
只是创建&'static [u8]
值的简写语法。
但是你不能返回对不属于函数之外的数据的数据的引用。如果数据不是静态知道的,那么是的,您必须返回Vec<u8>
才能通过所有权。
修改以在评论中解决问题。
其他不起作用的事情:
fn method1<'a>...
- 首先,这并没有改变传递引用的事实,你必须指的是在函数退出后仍然存在的东西。在全局变量之外(你应该永远不会使用,特别是在这样的情况下),没有办法在函数之外存在一个长期存在的值。您拥有以返回拥有其内容的值,并且永远不会成为借用。
声明一个通用的生命周期参数不会改变它。
&([u8], String)
- 这是无效的。首先,它与原来的问题完全相同:你不能将借款归还给你创造的东西。其次,它包含[u8]
,这是一个动态大小的类型。元组中不能有动态大小的类型;我们认为有效的唯一位置(我知道)位于结构的最后, 使结构本身变为动态大小。您无法传递,返回或存储动态大小的值。
(&[u8], &str)
- 这与原来的问题相同,只是现在第二个元组值也借用了。有些情况下,编译器可以猜测你的生命周期,但这不是其中之一(我不想在这里进入生命周期省略规则的描述)。