我正在努力,非常不成功地玩切片.
我把我的第一个问题减少到:
fn at<'a, T>(slice: &'a [T], index: usize) -> &'a T {
let item = slice[index];
item
}
Run Code Online (Sandbox Code Playgroud)
slice[index]根据文档,我希望返回类型是一个参考:
pub trait Index<Index> {
type Output;
fn index(&'a self, index: &Index) -> &'a <Self as Index<Index>>::Output;
// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器给我一个错误:
Run Code Online (Sandbox Code Playgroud)error[E0308]: mismatched types --> src/main.rs:3:5 | 3 | item | ^^^^ expected reference, found type parameter | = note: expected type `&'a T` found type `T`
我将其解释为意味着item类型与函数的返回类型不匹配(我item仅为调试目的引入,从返回中拆分表达式求值).
如果我将返回类型切换为T,这是类型item,我得到另一个错误消息:
Run Code Online (Sandbox Code Playgroud)error[E0508]: …
这不起作用:
\n\nlet vectors = vec![1, 2, 3, 4, 5, 6, 7];\n\nfor i in vectors {\n println!("Element is {}", i);\n}\n\nlet largest = vectors[0];\nRun Code Online (Sandbox Code Playgroud)\n\n错误信息:
\n\nlet vectors = vec![1, 2, 3, 4, 5, 6, 7];\n\nfor i in vectors {\n println!("Element is {}", i);\n}\n\nlet largest = vectors[0];\nRun Code Online (Sandbox Code Playgroud)\n\n该向量已移至循环中。它的所有权 \xe2\x80\x94 及其各个元素的所有权 \xe2\x80\x94 已永久转移到那里。
\n\n但这有效:
\n\nlet largest = vectors[0];\nlet largest2 = vectors[0];\nRun Code Online (Sandbox Code Playgroud)\n\n我不知道为什么;该vectors[0]值应该被移动到largest并且largest2应该失败,但它没有。
我想写一个函数,它接受一个包含任何类型的数组,并返回数组的最后一个元素,所以我试过:
fn main() {
let v = ["a", "b"];
println!("{}", last(&v));
}
fn last<T: Clone>(slice: &[T]) -> &T {
&slice[slice.len()-1]
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但当我应用一个小调整时:
fn main() {
let v = ["a", "b"];
println!("{}", last(&v));
}
fn last<T: Clone>(slice: &[T]) -> T {
&slice[slice.len()-1]
}
Run Code Online (Sandbox Code Playgroud)
然后我遇到了:
error[E0308]: mismatched types
--> <anon>:9:5
|
9 | &slice[n-1]
| ^^^^^^^^^^^ expected type parameter, found &T
|
= note: expected type `T`
found type `&T`
Run Code Online (Sandbox Code Playgroud)
如何将其转换&T为刚好T?
fn main() {
let number_list = vec![1, 2, 3, 4, 5];
let n = number_list[0];
let r = &number_list[0];
println!("{} : {} : {} : {}", n, r, number_list[0], &number_list[0]);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
1 : 1 : 1 : 1
Run Code Online (Sandbox Code Playgroud)
另一个问题是,除了参考之外,向量索引与引用和非引用之间的区别是什么?
我很生锈,并开始掌握所有权制度等等,但我仍然有一些挂断.例如,我有以下代码:
fn main() {
let mut t = vec![Box::new(4)];
let mut o = t[0];
*o = *o + 1;
t[0] = o;
println!("t[0]:{}", t[0]);
}
Run Code Online (Sandbox Code Playgroud)
这给了cannot move out of indexed content我正在初始化的行的错误o.我知道为什么会发生这种情况,我想,但我无法弄清楚我应该做什么而不是完成同样的事情.这是一个非常简化的案例,但任何帮助将不胜感激.谢谢!