相关疑难解决方法(0)

索引操作的返回类型是什么?

我正在努力,非常不成功地玩切片.

我把我的第一个问题减少到:

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)

但是,编译器给我一个错误:

error[E0308]: mismatched types
 --> src/main.rs:3:5
  |
3 |     item
  |     ^^^^ expected reference, found type parameter
  |
  = note: expected type `&'a T`
             found type `T`
Run Code Online (Sandbox Code Playgroud)

我将其解释为意味着item类型与函数的返回类型不匹配(我item仅为调试目的引入,从返回中拆分表达式求值).

如果我将返回类型切换为T,这是类型item,我得到另一个错误消息:

error[E0508]: …
Run Code Online (Sandbox Code Playgroud)

rust

11
推荐指数
2
解决办法
961
查看次数

向量借用和所有权

这不起作用:

\n\n
let 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];\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误信息:

\n\n
let 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];\n
Run Code Online (Sandbox Code Playgroud)\n\n

该向量已移至循环中。它的所有权 \xe2\x80\x94 及其各个元素的所有权 \xe2\x80\x94 已永久转移到那里。

\n\n

但这有效:

\n\n
let largest = vectors[0];\nlet largest2 = vectors[0];\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不知道为什么;该vectors[0]值应该被移动到largest并且largest2应该失败,但它没有。

\n

rust

10
推荐指数
1
解决办法
7500
查看次数

如何将`&T`转换为'T`?

我想写一个函数,它接受一个包含任何类型的数组,并返回数组的最后一个元素,所以我试过:

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

generics rust

6
推荐指数
1
解决办法
244
查看次数

为什么我可以在不使用引用的情况下获取它的所有权后访问它?

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)

另一个问题是,除了参考之外,向量索引与引用和非引用之间的区别是什么?

rust

2
推荐指数
1
解决办法
121
查看次数

生锈:无法摆脱索引的背景

我很生锈,并开始掌握所有权制度等等,但我仍然有一些挂断.例如,我有以下代码:

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.我知道为什么会发生这种情况,我想,但我无法弄清楚我应该做什么而不是完成同样的事情.这是一个非常简化的案例,但任何帮助将不胜感激.谢谢!

rust

0
推荐指数
1
解决办法
2244
查看次数

标签 统计

rust ×5

generics ×1