结构体表达式

语法

StructExpression :

      StructExprStruct

   | StructExprTuple

   | StructExprUnit

StructExprStruct :

   表达式中的路径 { (StructExprFields | StructBase)? }

StructExprFields :

   StructExprField (, StructExprField)* (, StructBase | ,?)

StructExprField :

   外部属性 *

   (

         标识符

      | (标识符 | 元组索引) : 表达式

   )

StructBase :

   .. 表达式

StructExprTuple :

   表达式中的路径 (

      ( 表达式 (, 表达式)* ,? )?

   )

StructExprUnit : 表达式中的路径

结构体表达式 用于创建一个结构体、枚举或联合体值。它由一个指向 结构体枚举变量联合体 项目的路径,以及该项目字段的值组成。结构体表达式有三种形式:结构体、元组和单元。

以下是结构体表达式的示例

#![allow(unused)]
fn main() {
struct Point { x: f64, y: f64 }
struct NothingInMe { }
struct TuplePoint(f64, f64);
mod game { pub struct User<'a> { pub name: &'a str, pub age: u32, pub score: usize } }
struct Cookie; fn some_fn<T>(t: T) {}
Point {x: 10.0, y: 20.0};
NothingInMe {};
TuplePoint(10.0, 20.0);
TuplePoint { 0: 10.0, 1: 20.0 }; // Results in the same value as the above line
let u = game::User {name: "Joe", age: 35, score: 100_000};
some_fn::<Cookie>(Cookie);
}

字段结构体表达式

字段用花括号括起来的结构体表达式允许您以任意顺序指定每个字段的值。字段名与其值之间用冒号分隔。

联合体 类型的值只能使用此语法创建,并且必须指定恰好一个字段。

函数式更新语法

构造结构体类型值的结构体表达式可以使用语法 .. 后跟一个表达式来表示函数式更新。.. 后面的表达式(基)必须与正在形成的新结构体类型具有相同的结构体类型。

整个表达式对指定的字段使用给定的值,并从基表达式移动或复制剩余的字段。与所有结构体表达式一样,结构体的所有字段都必须是 可见的,即使是那些没有明确命名的字段。

#![allow(unused)]
fn main() {
struct Point3d { x: i32, y: i32, z: i32 }
let mut base = Point3d {x: 1, y: 2, z: 3};
let y_ref = &mut base.y;
Point3d {y: 0, z: 10, .. base}; // OK, only base.x is accessed
drop(y_ref);
}

带有花括号的结构体表达式不能直接在 循环if 表达式的头部中使用,也不能在 if letmatch 表达式的 scrutinee 中使用。但是,如果结构体表达式在另一个表达式中,例如在 括号 内,则可以在这些情况下使用。

字段名可以是十进制整数值,以指定用于构造元组结构体的索引。这可以与基结构体一起使用,以填充未指定的剩余索引

#![allow(unused)]
fn main() {
struct Color(u8, u8, u8);
let c1 = Color(0, 0, 0);  // Typical way of creating a tuple struct.
let c2 = Color{0: 255, 1: 127, 2: 0};  // Specifying fields by index.
let c3 = Color{1: 0, ..c2};  // Fill out all other fields using a base struct.
}

结构体字段初始化简写

当使用命名(但没有编号)字段初始化数据结构(结构体、枚举、联合体)时,允许编写 fieldname 作为 fieldname: fieldname 的简写。这允许使用更紧凑的语法,减少重复。例如

#![allow(unused)]
fn main() {
struct Point3d { x: i32, y: i32, z: i32 }
let x = 0;
let y_value = 0;
let z = 0;
Point3d { x: x, y: y_value, z: z };
Point3d { x, y: y_value, z };
}

元组结构体表达式

字段用括号括起来的结构体表达式构造一个元组结构体。虽然为了完整性起见,它在这里被列为一个特定的表达式,但它等效于对元组结构体构造函数的 调用表达式。例如

#![allow(unused)]
fn main() {
struct Position(i32, i32, i32);
Position(0, 0, 0);  // Typical way of creating a tuple struct.
let c = Position;  // `c` is a function that takes 3 arguments.
let pos = c(8, 6, 7);  // Creates a `Position` value.
}

单元结构体表达式

单元结构体表达式只是一个指向单元结构体项的路径。它指的是单元结构体值的隐式常量。单元结构体值也可以使用无字段结构体表达式来构造。例如

#![allow(unused)]
fn main() {
struct Gamma;
let a = Gamma;  // Gamma unit value.
let b = Gamma{};  // Exact same value as `a`.
}