Rust书中提到“使用结构而不是元组结构几乎总是更好。”除了newtype模式之外,还有其他任何有未命名字段的优点吗?在我看来,newtype模式是具有元组结构的唯一有用的情况。
答案 0 :(得分:34)
它们彼此非常相似。
鉴于以下definitions
struct TupleStruct(i32, i32);
struct NormalStruct { a: i32, b: i32 }
我们可以构造结构和元组结构的实例,如下所示
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 };
作业如下工作
let TupleStruct(x, y) = ts;
println!("x: {}, y: {}", x, y);
let NormalStruct {a, b} = ns;
println!("a: {}, b: {}", a, b);
元组结构的字段具有隐式名称(0,1,...)。因此,访问字段按如下方式执行
println!("Accessing ns by name - {}{}", ns.a, ns.b);
println!("accessing ts by name - {}{}", ts.0, ts.1);
至少出于文档目的,将明确的名称分配给结构的字段几乎总是更清楚。这就是为什么在Rust社区,我见过很多人争论总是使用普通结构。
然而,可能存在这样的情况:结构的字段本质上是“匿名的”#34;一个值得注意的情况是" newtype" (带有一个字段的元组结构),其中只包含内部类型。
在这种情况下,命名内部字段并不能提供任何其他信息。
struct Inches { inner: i32 }
VS
struct Inches(i32)
section on structs on the Rust book有关于newtypes的更多信息。