Каков порядок оценки кортежей в Rust? - PullRequest
0 голосов
/ 22 января 2019

Элементы кортежа могут иметь побочные эффекты, и некоторые из них могут зависеть от других.Рассмотрим эту программу:

fn main() {
    let mut v = vec![1, 2];
    match (v.pop(), v.pop()) {
        (Some(z), Some(y)) => println!("y = {}, z = {}", y, z),
        _ => unreachable!(),
    }
}

Она выводит y = 1, z = 2 или y = 2, z = 1?В нескольких раундах на Rust Playground предлагается первый вариант на стабильной версии 1.32.0, но, возможно, он изменится, если я буду запускать его несколько раз, перекомпилировать компилятор, менять версии компилятора и т. Д.

Имеется ли документально подтвержденное обязательство или, по крайней мере, намерение поддерживать определенный порядок оценки для кортежей (например, по глубине сначала и слева направо)?

1 Ответ

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

Да, порядок оценки для кортежей гарантированно слева направо (что также подразумевает глубину в первую очередь, поскольку значение должно быть полностью построено).

К сожалению, это никогда не указывается явно где-либо, что я могу найти, но можно сделать вывод из сильных гарантий обратной совместимости Rust. Внесение изменений в порядок оценки может привести к слишком большим поломкам, чтобы их можно было серьезно рассмотреть.

Я бы также ожидал, что оптимизатору разрешено вносить изменения, когда это безопасно. Например, если выражения в кортеже не имеют побочных эффектов, изменение их порядка невидимо для пользователя.

Смотри также:

...