Как мне «вернуться» из выражения? - PullRequest
0 голосов
/ 02 января 2019

Эта функция работает хорошо: когда она находит адаптер, она останавливается и возвращается.

fn choose_adapter(instance: vk::Instance) -> Option<Adapter<vk::Backend>> {
    let adapters = instance.enumerate_adapters();

    for adapter in adapters {
        if adapter.info.device_type == DeviceType::DiscreteGpu {
            return Some(adapter);
        }
    }
    return None;
}

Следующая модификация не компилируется.При добавлении ; к Some(adapter) оно падает и всегда оценивается как None.

let adapter = match {
    let adapters = instance.enumerate_adapters();

    for adapter in adapters {
        if adapter.info.device_type == DeviceType::DiscreteGpu {
            Some(adapter)
        }
    }
    None
} {
    Some(val) => val,
    None => panic!(""),
};

Как заставить последнее выражение работать как функция?

1 Ответ

0 голосов
/ 02 января 2019

Вы, вероятно, хотите

let adapter = instance
    .enumerate_adapters()
    .into_iter()
    .find(|adapter| adapter.info.device_type == DeviceType::DiscreteGpu)
    .expect("no discrete GPU adapter found");

Что касается вашего реального вопроса, если вы хотите выйти из цикла for раньше, не возвращаясь из функции, вам нужно использовать break:

let adapter = {
    let adapters = instance.enumerate_adapters();
    let mut found = None;
    for adapter in adapters {
        if adapter.info.device_type == DeviceType::DiscreteGpu {           
            found = Some(adapter);
            break;
        }
    }
    found
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...