Избегайте создания строки только для соответствия

Я только что написал это, что на языке низкого уровня кажется уродливым:

    match std::env::var("IN_DEPLOYMENT")
        .unwrap_or("false".to_string())
        .as_str()
    {
        "false" | "FALSE" | "0" => {
            tracing_subscriber::fmt().init();
        }
        _ => tracing_subscriber::fmt().json().init(),
    }

Как мне избежать необходимости использования временной строки? Моей первой мыслью было сопоставить непосредственно результат, но я не мог понять, как преобразовать Result<String,_> в Result<&str, _>.

@Unlikus, вы не можете использовать Result::map, потому что он будет использовать оригинальный Result, содержащий String. Поэтому вы не можете вернуть ссылку на него. Result::as_deref хотя могу это сделать.

Aleksander Krauze 03.09.2024 13:19
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сначала вам следует преобразовать Result<String, E> в Result<&str, &E>. Это можно сделать с помощью метода Result::as_deref:

fn foo() {
    match std::env::var("IN_DEPLOYMENT").as_deref().unwrap_or("false") {
        "false" | "FALSE" | "0" => todo!(),
        _ => todo!(),
    }
}

С другой стороны, если вам действительно нужен собственный String, отдайте предпочтение Result::unwrap_or_else вместо Result::unwrap_or (тот же аргумент применим и к Option), потому что это предотвратит выделение, когда есть данные для развертывания. Есть ворс, который проверяет это.

Вот и все! Спасибо. Я попробовал .as_ref, но все время забываю, что преобразование выполняет разыменование. Спасибо и за подсказку.

2e0byo 03.09.2024 13:31

@2e0byo as_deref() то же самое, что as_ref().map(Deref::deref). Так что вы можете использовать as_ref, это короче.

Aleksander Krauze 03.09.2024 13:36

ох, это *&, не так ли. Я давно не пишу ржавчину и не претендую на какую-либо компетентность.

2e0byo 03.09.2024 13:38

Другие вопросы по теме