如何在Rust中同时分配2个变量?

时间:2017-12-07 16:09:43

标签: rust

我目前正在教自己Rust带有一个roguelike教程,而我正试图通过按键来对角移动一个字符,这意味着player_x -=1player_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 { printable: 'k', .. } => *player_x -= 1,

_ => {}

您可以看到我在这里尝试做什么,但这会抛出一条错误消息,说该模式无法访问,我将如何修复此代码?

这是the full code,它相当小,不确定编译所需要的是什么:

extern crate tcod;
extern crate input;

use tcod::console::*;
use tcod::colors;

// actual size of the window
const SCREEN_WIDTH: i32 = 80;
const SCREEN_HEIGHT: i32 = 50;

const LIMIT_FPS: i32 = 20;  // 20 frames-per-second maximum


fn handle_keys(root: &mut Root, player_x: &mut i32, player_y: &mut i32) -> bool {
    use tcod::input::Key;
    use tcod::input::KeyCode::*;

    let key = root.wait_for_keypress(true);
    match key {
        Key { code: Enter, alt: true, .. } => {
            // Alt+Enter: toggle fullscreen
            let fullscreen = root.is_fullscreen();
            root.set_fullscreen(!fullscreen);
        }
        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 { printable: 'k', ..} => *player_x -= 1,

        _ => {},
    }

    false
}

fn main() {
    let mut root = Root::initializer()
        .font("terminal8x8_gs_tc.png", FontLayout::Tcod)
        .font_type(FontType::Greyscale)
        .size(SCREEN_WIDTH, SCREEN_HEIGHT)
        .title("Rust/libtcod tutorial")
        .init();

    tcod::system::set_fps(LIMIT_FPS);

    let mut player_x = SCREEN_WIDTH / 2;
    let mut player_y = SCREEN_HEIGHT / 2;

    while !root.window_closed() {
        root.set_default_foreground(colors::WHITE);
        root.put_char(player_x, player_y, '@', BackgroundFlag::None);

        root.flush();

        root.put_char(player_x, player_y, ' ', BackgroundFlag::None);

        // handle keys and exit game if needed
        let exit = handle_keys(&mut root, &mut player_x, &mut player_y);
        if exit {
            break
        }
    }
}

2 个答案:

答案 0 :(得分:2)

  

如何在Rust中同时分配2个变量?

你做不到。您可以一次绑定两个变量:

let (a, b) = (1, 2);

如果您不想创建新绑定,则需要有两个赋值语句:

let mut a = 1;
let mut b = 2;

a = 3;
b = 4;

在您的情况下,对于匹配语句,您需要引入一个块:

let key = 42;
let mut a = 1;
let mut b = 2;

match key {
    0 => {
        a += 1;
        b -= 1;
    }
    _ => {
        a -= 10;
        b *= 100;
    }
}

您还可以将match表达式计算为元组,然后为该元组创建新的绑定并在之后应用它们:

let key = 42;
let mut x = 1;
let mut y = 2;

let (d_x, d_y) = match key {
    0 => (1, -1),
    _ => (10, 10),
};

x += d_x;
y += d_y;

强烈建议阅读The Rust Programming Language,而不是试图通过直觉或反复试验来学习Rust。它有一个entire chapter on the match statement

另见:

答案 1 :(得分:1)

第二个printable: 'k'无法访问,因为第一个将匹配。你想要的是在比赛的同一臂做两个任务,如下:

Key { printable: 'k', .. } => {
    *player_y -= 1;
    *player_x -= 1;
}