如何交换两个变量?

Nsu*_*i _ 17 rust

这个Python代码最接近的等效Rust代码是什么?

a, b = 1, 2
a, b = b, a + b
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个迭代的Fibonacci函数.我有Python代码我想转换为Rust.一切都很好,除了交换部分.

def fibonacci(n):
    if n < 2:
        return n
    fibPrev = 1
    fib = 1
    for num in range(2, n):
        fibPrev, fib = fib, fib + fibPrev
    return fib
Run Code Online (Sandbox Code Playgroud)

She*_*ter 22

交换变量时,您最想要的是为和创建新的绑定.ab

fn main() {
    let (a, b) = (1, 2);
    let (b, a) = (a, a + b);
}
Run Code Online (Sandbox Code Playgroud)

但是,在您的实际情况中,没有一个很好的解决方案.如上所述,您始终为a和创建新绑定b,但您希望修改现有绑定.我所知道的一个解决方案是使用临时的:

fn fibonacci(n: u64) -> u64 {
    if n < 2 {
        return n;
    }
    let mut fib_prev = 1;
    let mut fib = 1;
    for _ in 2..n {
        let next = fib + fib_prev;
        fib_prev = fib;
        fib = next;
    }
    fib
}
Run Code Online (Sandbox Code Playgroud)

你也可以这样做,以便你改变元组:

fn fibonacci(n: u64) -> u64 {
    if n < 2 {
        return n;
    }
    let mut fib = (1, 1);
    for _ in 2..n {
        fib = (fib.1, fib.0 + fib.1);
    }
    fib.1
}
Run Code Online (Sandbox Code Playgroud)

您可能还有兴趣交换两块内存的内容.99%以上的时间,你想要重新绑定变量,但是你想要在很短的时间内"改变"事物:

fn main() {
    let (mut a, mut b) = (1, 2);
    std::mem::swap(&mut a, &mut b);

    println!("{:?}", (a, b));
}
Run Code Online (Sandbox Code Playgroud)

请注意,执行此交换并不简洁,只需一步即可将这些值相加.

也可以看看:

  • 你能详细说明什么时候有人想要改变原地而不是重新绑定变量吗?另外,创建新绑定有什么问题?效率不高? (2认同)

aSp*_*pex 5

此外,在Rust中实现Fibonacci序列的更好方法是使用Iterator特征:

// Iterator data structure
struct FibIter(u32, u32);

// Iterator initialization function
fn fib() -> FibIter {
    FibIter(0u32, 1u32)
}

// Iterator trait implementation
impl Iterator for FibIter {
    type Item = u32;
    fn next(&mut self) -> Option<u32> {
        *self = FibIter(self.1, self.1 + self.0);
        Some(self.0)
    }
}

fn main() {
    println!("{:?}", fib().take(15).collect::<Vec<_>>());
}
Run Code Online (Sandbox Code Playgroud)

请参阅迭代器的Rust Programming Language 一章.