map()
предназначен для преобразующего необязательного значения, в то время как if let
в основном необходимо для выполнения побочных эффектов. Хотя Rust не является чистым языком, поэтому любой из его кодовых блоков может содержать побочные эффекты, семантика карты все еще существует. Использование map()
для выполнения побочных эффектов, безусловно, возможно, только путает читателей вашего кода. Обратите внимание, что он не должен иметь штрафов за производительность, по крайней мере, в простом коде. Оптимизатор LLVM отлично способен встраивать замыкание непосредственно в вызывающую функцию, поэтому он становится эквивалентным оператору match
.
Перед if let
единственным способом для выполнения побочных эффектов на условиях Option
был либо матчем или if
с Option::is_some()
чеком. match
подхода является самым безопасными один, но очень многословным, особенно когда много вложенных проверки необходимы:
match o1 {
Some(v1) => match v1.f {
Some(v2) => match some_function(v2) {
Some(r) => ...
None => {}
}
None => {}
}
None => {}
}
Обратите внимание известный дрейфа и вправо много синтаксического шум. И только ухудшается, если ветви - это не простые совпадения, а правильные блоки с несколькими утверждениями.
if option.is_some()
подход, с другой стороны, немного менее подробный, но все еще читается очень плохо. Также его проверка состояния и unwrap()
не статически связаны, поэтому можно ошибиться, если компилятор не заметил это.
if let
решает проблему детальности, базируется на той же схеме, соответствующей инфраструктуры, как match
(так что это труднее получить неправильно, чем if option.is_some()
) и, как побочный эффект, позволяет использовать произвольные типы в образцах, не только Option
. Например, некоторые типы могут не предоставлять map()
-подобных методов; if let
по-прежнему будут работать с ними очень красиво. Таким образом, if let
- это явный выигрыш, следовательно, он идиоматичен.
Примечание: Я принимаю этот ответ, потому что он кратко суммирует основные различия _technical_, но см. Ответ @ Vladimir для более полного объяснения. – bluenote10