gpt4 book ai didi

struct - 创建零大小结构的多种方法有什么区别?

转载 作者:行者123 更新时间:2023-11-29 07:43:20 24 4
gpt4 key购买 nike

我找到了四种不同的方法来创建一个没有数据的struct:

  • struct A{} // empty struct / empty braced struct
  • struct B(); // empty tuple struct
  • struct C(()); // unit-valued tuple struct
  • struct D; // unit struct

(我将只包含 () 和单变体 enum 声明的任意嵌套元组排除在外,因为我理解为什么那些不应该被使用)。

这四种声明有什么区别?我会将它们用于特定目的,还是可以互换?

这本书和引用资料出奇地没有帮助。我确实找到了 this accepted RFC (clarified_adt_kinds)这有点不同,即单元结构还声明了一个常量值 D 并且元组结构还声明了构造函数 B()C( _: ())。但是,它没有提供关于为什么使用哪个的设计指南。

我的猜测是,当我使用 pub 导出它们时,实际上可以在我的模块之外构造哪些类型存在差异,但我没有找到关于这方面的结论性文档。

最佳答案

这四个定义之间只有两个功能差异(我稍后会提到第五种可能性):

  1. 语法(最明显的)。 mcarton's answer进入更多细节。
  2. 当结构被标记为pub时,它是否是constructor (也称为 struct literal syntax )可在其定义的模块外使用。

您的示例中唯一不能从当前模块外部直接构造的示例是 C。如果你尝试这样做,你会得到一个错误:

mod stuff {
pub struct C(());
}
let _c = stuff::C(()); // error[E0603]: tuple struct `C` is private

发生这种情况是因为该字段未标记为pub;如果将 C 声明为 pub struct C(pub ()),则错误消失。

还有另一种你没有提到的可能性,它给出了一个稍微更具描述性的错误消息:一个普通的结构,具有一个零大小的非 pub 成员。

mod stuff {
pub struct E {
_dummy: (),
}
}
let _e = stuff::E { _dummy: () }; // error[E0451]: field `_dummy` of struct `main::stuff::E` is private

(同样,您可以通过使用 pub 声明它来使 _dummy 字段在模块外部可用。)

由于 E 的构造函数只能在 stuff 模块中使用,stuff 可以独占控制 的取值时间和方式E 被创建。标准库中的许多结构都利用了这一点,例如 Box(举一个明显的例子)。零大小类型的工作方式完全相同;事实上,从定义它的模块外部,你知道不透明类型是零大小的唯一方法是调用 mem::size_of .

另见

关于struct - 创建零大小结构的多种方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50162597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com