元组结构体有哪些使用场景?

44

Rust书中提到,“使用struct结构体通常比使用tuple struct元组结构体更好。”除了newtype模式之外,是否还有其他未命名字段的优点?在我看来,newtype模式似乎是唯一有用的元组结构体案例。


4
另一个使用案例是小元数的数学向量,比如在二维或三维向量处理库中。尽管你也可以在那里使用 newtype 来表示数组。 - oli_obk
1个回答

72

它们非常相似。

考虑以下定义

struct TupleStruct(i32, i32);
struct NormalStruct {
    a: i32,
    b: i32,
}

我们可以按照以下方式构造结构体和元组结构体的实例

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

// shortcut to initialize the fields of a struct using the values of the
// fields of another struct
let ns2 = NormalStruct { a: 5, ..ns };
let ts2 = TupleStruct { 0: 1, ..ts }; // for TupleStruct it needs curly brackets
                                      // and implicit field names

作业的工作方式如下

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

let NormalStruct { a, b } = ns;
println!("a: {}, b: {}", a, b);

元组结构体的字段具有隐式名称(0、1、...)。因此,访问字段的方式如下:

一个元组结构体的字段具有隐式名称(0、1、...)。因此,访问字段的方式如下

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

至少在文档记录方面,为结构体的字段指定明确的名称几乎总是更清晰的。这就是为什么在Rust社区中,我见过许多人主张始终使用普通结构体的原因。

然而,在结构体的字段本质上是“匿名”的情况下,可能会有一些特例,其中一个显著的例子是“newtype”(只有一个字段的元组结构体),在这种情况下,命名内部字段无疑不提供任何其他信息。

struct Inches {
    inner: i32,
}

对抗

struct Inches(i32);

Rust书上关于structs的章节有更多关于newtypes的信息。


谢谢。type Args = (i32, i32)struct Args(i32, i32),你更喜欢哪个? - Helin Wang
1
@HelinWang 这是两个不同的概念。使用 type 关键字可以定义一个别名(为相同的东西创建另一个名称),并且您可以在任何需要使用另一个名称的地方使用它。请参见 playground - Paolo Falabella
2
除了存储字段名称外,内存使用和分配方面是否存在重大差异?还是它们只是实现相同功能的两种不同方式? - catleeball

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