Можно ли инициализировать неизменяемые переменные соответствием в Rust?

У меня есть этот фрагмент кода, в котором я пытаюсь преобразовать аргументы командной строки в целые числа. Проблема в том, что переменные width и height действительно должны быть неизменными, так как я не планирую их менять. Есть ли способ использовать сопоставление типа let width = {match....} и инициализировать их за один шаг как неизменяемые переменные вместо того, чтобы давать им значение по умолчанию и изменять их? Я считаю, что так будет безопаснее и эффективнее.

let args: Vec<String> = env::args().collect();
let width_arg = &args[1];
let height_arg = &args[2];

let mut width = 0;
let mut height = 0;

match width_arg.parse::<i32>() {
    Ok(w) => width = w,
    Err(_) => ask_for_number(),
}

match height_arg.parse::<i32>() {
    Ok(h) => height = h,
    Err(_) => ask_for_number(),
}

person Sarp Başaraner    schedule 24.01.2018    source источник
comment
Вас может заинтересовать github.com/TeXitoi/structopt   -  person Boiethios    schedule 24.01.2018


Ответы (2)


Конечно, совпадение - это выражение, поэтому вы можете переписать его следующим образом:

let args: Vec<String> = env::args().collect();
let width_arg = &args[1];
let height_arg = &args[2];

let width = match width_arg.parse::<i32>() {
    Ok(w) => w,
    Err(_) => ask_for_number(),
};

let height = match height_arg.parse::<i32>() {
    Ok(h) => h,
    Err(_) => ask_for_number(),
};
person grovesNL    schedule 24.01.2018
comment
Это именно то, что я искал. Спасибо. - person Sarp Başaraner; 24.01.2018

Да, просто инициализируйте переменную так: let a = match b { /* your code here*/ };

person Liam Borella    schedule 24.01.2018