我想构造一个元组并将结果的一部分分配给一个新变量,并将结果的另一部分分配给现有的.
以下代码说明了intent(这是一个导致无限循环打印的愚蠢示例[0]):
fn main() {
let mut list = &[0, 1, 2, 3][..];
while !list.is_empty() {
let (head, list) = list.split_at(1);
// An obvious workaround here is to introduce a new variable in the above
// let statement, and then just assign it to list.
println!("{:?}", head);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码创建一个新变量,list而不是重新分配它.
如果我将代码更改为以下(为了避免let引入新list变量),它不会编译:
fn main() {
let mut list = &[0, 1, 2, 3][..];
while !list.is_empty() {
let head;
(head, list) = list.split_at(1);
println!("{:?}", …Run Code Online (Sandbox Code Playgroud) 我有一个带字段的结构:
struct A {
field: SomeType,
}
Run Code Online (Sandbox Code Playgroud)
给定a &mut A,如何移动值field并交换新值?
fn foo(a: &mut A) {
let mut my_local_var = a.field;
a.field = SomeType::new();
// ...
// do things with my_local_var
// some operations may modify the NEW field's value as well.
}
Run Code Online (Sandbox Code Playgroud)
最终目标相当于一项get_and_set()行动.在这种情况下,我并不担心并发性.
我想进入一个循环,n其中包含一个由函数借用的变量.在每一步,n取一个新的价值; 退出循环时,作业完成后,与其他变量的帮助,n将永远不会再被使用.
如果我不使用引用,我有这样的事情:
fn test(n: Thing) -> usize {
// stuff
let mut n = n;
for i in 1..10 {
let (q, m) = n.do_something(...);
n = m;
// stuff with x
}
x
}
Run Code Online (Sandbox Code Playgroud)
x一些与计算的结果q和m,但它是一个usize类型的,我没有遇到任何问题,在这部分代码.我没有测试这段代码,但这是个主意.我可以编写像这样的工作代码.
因为我想用引用来做; 我试着写:
fn test(n: &Thing) -> usize {
// stuff
let mut n = n;
for i in 1..10 {
let (q, m) = (*n).do_something(...);
n = &m; …Run Code Online (Sandbox Code Playgroud) 我正在努力寻找一种方法从矢量的末尾取两个值,对这些值求和,并将和推送到矢量.
我发现pop,truncate和drain不工作,因为他们从原来的矢量取出值.
fn main() {
println!("Which Fibonacci number would you like to find?");
let mut fib_num = String::new();
io::stdin().read_line(&mut fib_num)
.expect("Failed to read line");
let fib_num: u32 = fib_num.trim().parse()
.expect("Please enter a number");
let mut stored_nums: Vec<u32> = vec![0, 1];
while fib_num > stored_nums.len() as u32 {
let mut limit = stored_nums.len();
let mut new_num1 = stored_nums.pop().unwrap();
let mut new_num2 = stored_nums.pop().unwrap_or(0);
stored_nums.push(new_num1 + new_num2);
}
}
Run Code Online (Sandbox Code Playgroud) 我试图在没有任何库的情况下在 Rust 中交换两个整数。
fn main() {
let mut a = 5;
let mut b = 6;
swap(&mut a, &mut b);
println!("{}, {}", a, b); // expecting 6, 5
}
Run Code Online (Sandbox Code Playgroud)
首先我试过:
fn swap(mut a: &mut u32, mut b: &mut u32) {
(a, b) = (b, a); // destructuring assignments are not currently supported
}
Run Code Online (Sandbox Code Playgroud)
然后:
fn swap(mut a: &mut u32, mut b: &mut u32) {
let temp = a;
a = b;
b = temp;
}
// got error[E0623]: lifetime mismatch …Run Code Online (Sandbox Code Playgroud) I\xe2\x80\x99m 收到错误 I\xe2\x80\x99m 不确定如何处理,与 I\xe2\x80\x99m 尝试的元组分配相关。下面的函数incr出现left-hand of expression not valid错误。我有什么误解吗?
struct Fib {\n i: u64,\n fa: u64,\n fb: u64,\n}\n\nimpl Fib {\n fn incr(&mut self) {\n self.i += 1;\n (self.fa, self.fb) = (self.fa + self.fb, self.fa);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n 我目前正在通过 roguelike 教程自学 Rust,并且我正在尝试按下按键以对角移动角色,这意味着player_x -=1,player_y -= 1向左。
无论我尝试以哪种方式排列代码,我都会不断收到来自编译器的错误消息。我在文档或 GitHub 上的任何地方都找不到任何示例。
Key { code: Escape, .. } => return true, // exit game
// movement keys
Key { code: Up, .. } => *player_y -= 1,
Key { code: Down, .. } => *player_y += 1,
Key { code: Left, .. } => *player_x -= 1,
Key { code: Right, .. } => *player_x += 1,
Key { printable: 'k', .. } => *player_y -= 1,
Key …Run Code Online (Sandbox Code Playgroud)