Rust中带有圆括号的结构体是用来做什么的?

19
我发现了一个我不理解的语言结构:
pub struct OpenOptions(fs_imp::OpenOptions);

我甚至用那些尖括号创建了一份可以编译的代码,但我仍然无法理解它:

struct Foo {
    bar: i32,
}

struct Baz(Foo);

fn main() {
    let mut x: Baz = Baz(Foo{ bar: 3 });
}

那些圆括号有什么作用?


2
它们是Tuple结构体 - interjay
这是更新后的链接,指向[https://doc.rust-lang.org/book/ch05-01-defining-structs.html#using-tuple-structs-without-named-fields-to-create-different-types 元组结构体]。 - Ted
3个回答

16

正如评论中指出的那样,这些是 元组结构体。当您想要将一个元组与其他元组区分开来,但命名其每个字段将是冗余或过于冗长时,它们非常有用。换句话说,通过为元组命名,您可以澄清其目的。

元组结构体可用于创建简单的值对象。

struct Color(i32, i32, i32);

let black = Color(0, 0, 0);

7
很不方便,颜色并不是元组结构体的好例子 :) 因为它可以是RGB、HSV、HSL或任何其他三部分编码。但是我们明白您的意思了。 - Kroltan
同意,枚举可以用于RGB、HSV、HSL。 - rnofenko

0
我认为书中的例子(或所选答案中的例子)并不像它本可以那样清晰。这个语法创建了一个具有相同结构的新类型:可能是一个3x i32元组,就像在例子中一样,或者是一个类似于你的例子中的struct Foo。因此,您不能混合类型为Foo和类型为Baz的东西。然而,一些实验表明,给它一个像Foo这样的类型,实际上只提供了一个1元组。考虑一下您的示例的扩展:
#[derive(Debug)]
struct Foo {
    bar: i32,
}

#[derive(Debug)]
struct Baz(Foo);

fn main() {
    let mut x: Baz = Baz(Foo{ bar: 3 });
    let y: Baz = Baz { 0: Foo { bar: 4 }};
    let foo = Foo { bar: 5 };
    let z: Baz = Baz(foo,);
    println!("x {:?} x.0 {:?}", x, x.0);
    println!("y {:?}", y);
    println!("z {:?}", z);
}

所以你的 x 是由一个包含 Foo 的 1-元组构建的 Baz,这在 println(x) 和 z 的定义中都很清楚。y 的定义使用了更常见的构造函数语法,使用元组索引来定位 Foo。你不能省略 "0:"。


-1

这是一个“元组结构体”。结构体是多个值的组合。对于典型的结构体,字段值通过字段名称访问。对于元组结构体,没有字段名称,字段值通过位置索引(例如.0,.1)访问。如果报错说字段不是私有的,可以加上pub,例如struct Baz(pub Foo)。一旦你知道它只是一个带有位置作为访问键的值包,就很简单了。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

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