Right, purity aka referential transparency is basically required when you have lazy evaluation by default (as in Haskell).
Since Rust is a strictly evaluated language, it's easy to reason about the order statements and expressions will be executed in and when side effects will happen, so purity is not generally necessary.