【问题标题】:What is the order of function arguments evaluation and structs initialization in Rust?Rust 中函数参数评估和结构初始化的顺序是什么?
【发布时间】:2019-08-22 14:55:29
【问题描述】:

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());
}

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

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

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

是否保证顺序是a,然后是b

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

db_connection.transaction(||
    Ok(CompanyAndUser {
        company: companies::register_company(...)?, // performs diesel insert
        user: users::register_user(...)?, // performs diesel insert
    })
);

显然,我希望在一个事务中订购这两个柴油调用。 不幸的是,我没有找到任何有关此的信息。另外,我发现了一些或多或少相关的信息,但它已经很旧了。

【问题讨论】:

    标签: rust


    【解决方案1】:

    以前没有指定顺序,现在是left-to-right

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

    和:

    这些表达式的操作数在应用表达式的效果之前进行评估。采用多个操作数的表达式按照源代码中的说明从左到右进行计算。

    【讨论】:

    • 不需要这个。结构字段按照您编写它们的顺序进行评估。请参阅Niko's 答案。
    • 如果你有这个struct A { a: u8, b: u8 }结构并且你写A { a: a(), b: b() }那么顺序是a()然后b()。如果你写A { b: b(), a: a() },那么顺序是b(),然后是a()
    • @zrzka 我已经更新了结构初始化,但如果你不担心我窃取你的评论,我可以添加 Niko 的答案:P
    • 在这里偷东西? :) 社区努力,我不拥有任何东西,请随意 :)
    • 这个答案已经过时了。该订单已记录并保证现在是从左到右的:doc.rust-lang.org/reference/…“采用多个操作数的表达式按照源代码中所写的从左到右进行计算。”
    猜你喜欢
    • 2010-11-17
    • 2015-08-10
    • 2020-06-07
    • 2023-03-03
    • 2017-04-03
    • 2019-01-05
    相关资源
    最近更新 更多