Rust中函数参数的求值顺序和结构体初始化的顺序是什么?

15
Rust中是否定义了函数参数的求值顺序?
fn f(a: u64, b: u64, c: u64) {}
fn g() -> u64 { 0 }
fn h() -> u64 { 1 }
fn i() -> u64 { 2 }

fn main() {
    f(g(), h(), i());
}

此外,我担心结构体的初始化顺序:

Also, I am worried about the initialization order of structs:

返回结果为:

此外,我担心结构体的初始化顺序:

fn f() {}
fn g() {}

A {
    a: f(),
    b: g(),
}

订单保证是先是a,然后才是b吗?

对于我的特定用例,我将在diesel事务中初始化一个struct,如下:

db_connection.transaction(||
    Ok(CompanyAndUser {
        company: companies::register_company(...)?, // performs diesel insert
        user: users::register_user(...)?, // performs diesel insert
    })
);
很明显,我希望在交易中这两个柴油呼叫的顺序是有序的。 不幸的是,我没有找到任何相关信息。此外,我发现一些相关信息,但它们都很旧了。
1个回答

11

以前顺序是不确定的,但现在变成了从左到右

许多表达式包含子表达式,称为表达式的操作数。

并且:

这些表达式的操作数在应用表达式的效果之前被评估。具有多个操作数的表达式按照源代码中书写的从左到右进行评估。


1
不需要这样做。结构体字段按照编写顺序进行评估。请参见Niko的回答。 - zrzka
如果你有这个 struct A { a: u8, b: u8 } 结构体,并且你写了 A { a: a(), b: b() },那么顺序是 a() 然后是 b()。如果你写了 A { b: b(), a: a() },那么顺序是 b() 然后是 a() - zrzka
@zrzka,我已经更新了有关结构体初始化的内容,但如果你不介意我抄袭你的评论,我可以加上Niko的答案:P - Boiethios
1
这里有偷窃吗? :) 这是社区的努力,我什么都不拥有,随意使用 :) - zrzka
2
这个答案已经过时了。现在的顺序已经被记录下来,并且保证是从左到右的:https://doc.rust-lang.org/reference/expressions.html#evaluation-order-of-operands。"取多个操作数的表达式按照源代码中写的从左到右进行评估。" - orlp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接