元组结构有哪些用例?

Ant*_*dra 19 rust

Rust书中提到"使用结构而不是元组结构几乎总是更好".除了newtype模式之外,还有其他任何有未命名字段的优点吗?在我看来,newtype模式是具有元组结构的唯一有用的情况.

Pao*_*lla 40

它们彼此非常相似.

鉴于以下定义

struct TupleStruct(i32, i32);
struct NormalStruct {
    a: i32,
    b: i32,
}
Run Code Online (Sandbox Code Playgroud)

我们可以构造结构和元组结构的实例如下

let ts = TupleStruct(1, 2);
let ns = NormalStruct { a: 1, b: 2 };

// AFAIK, this shortcut to initialize the fields of a struct using the values of the fields
// of another struct can't be done using tuple structs.
let ns2 = NormalStruct { a: 5, ..ns };
Run Code Online (Sandbox Code Playgroud)

作业的工作原理如下

let TupleStruct(x, y) = ts;
println!("x: {}, y: {}", x, y);

let NormalStruct { a, b } = ns;
println!("a: {}, b: {}", a, b);
Run Code Online (Sandbox Code Playgroud)

一个元组结构的领域有隐名(0,1,...).因此,访问字段如下执行

println!("Accessing ns by name - {}{}", ns.a, ns.b);
println!("accessing ts by name - {}{}", ts.0, ts.1);
Run Code Online (Sandbox Code Playgroud)

至少出于文档目的,将明确的名称分配给结构的字段几乎总是更清楚.这就是为什么在Rust社区我见过很多人争论总是使用普通结构.

但是,可能存在这样的情况:结构的字段本质上是"匿名的",一个值得注意的情况是"newtype"(具有一个字段的元组结构),其中您只包装内部类型.

在这种情况下,命名内部字段并不能提供任何其他信息.

struct Inches {
    inner: i32,
}
Run Code Online (Sandbox Code Playgroud)

VS

struct Inches(i32);
Run Code Online (Sandbox Code Playgroud)

关于Rust书籍结构部分有关于newtypes的更多信息.

  • 除了存储字段名称之外,内存使用和分配是否有任何显着差异?或者它们只是实现同一件事的两种不同方法? (2认同)