Ответ 1
Официально
Порядок оценки пока не указан в ссылке на данный момент:
[...] правила оценки выражений включают в себя указание как значения, создаваемого выражением, так и порядка, в котором его подвыражения сами оцениваются.
Давайте посмотрим на эти подвыражения:
На дополнительной странице о выражениях вызова ничего не указано о приоритете в вызове функции.
Однако в отношении инициализации структуры в ссылке, похоже, говорится, что порядок оценки соответствует порядку объявления:
Выражение структуры с полями, заключенными в фигурные скобки, позволяет указать значение для каждого отдельного поля в любом порядке [подчеркнуто мной].
Если ссылка указывает на то, что она работает "в любом порядке", я полагаю, потому что порядок имеет значение.
Неофициально
- Нико Мацакис написал, что порядок оценки слева направо.
- Стив Клабник написал то же самое.
Чтобы ответить на ваш конкретный вопрос, очевидное решение состоит в том, чтобы превратить ваши операции в операторы:
db_connection.transaction(|| {
let company = companies::register_company(...)?; // performs diesel insert
let user = users::register_user(...)?; // performs diesel insert
Ok(CompanyAndUser { company, user })
});