Ссылки как необязательные аргументы функций - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь реализовать функцию с необязательной ссылкой. Я хотел бы иметь возможность использовать его так:

fn main() {
    let x = 557483943;

    test_function(x, None);

    let params = parameters(x);
    test_function(x, Some(&params));
}

, где parameters(x) может занять некоторое время для выполнения. Поэтому я хотел бы иметь возможность передать необязательную ссылку на функцию. Сейчас я использую это в качестве тестового кода:

#[derive(Debug)]
pub struct Parameters {
    a: u32,
    b: u32,
}

pub fn parameters(x: u32) -> Parameters {
    // would be a tedious calculation...
    let a = x / 6453;
    let b = x % 589703;
    Parameters { a, b }
}

Я придумал следующее:

pub fn test_function(x: u32, params: Option<&Parameters>) {
    // tmp_params is needed as owner of the return value of 
    // parameters(x) that outlives the match statement
    let tmp_params: Parameters;

    let params = match params {
        Some(params) => params,
        None => {
            tmp_params = parameters(x);
            &tmp_params
        },
    };
    println!("params: {:?}", &params);
}

, который работает, но я не уверен, что это идиоматизм c способ сделать это в ржавчине.

Есть ли способ избежать tmp_params и создать Parameters, созданный в операторе match, изживший сам оператор match?

Есть ли лучший / более идиоматический c способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...