Box::new 内的结构是否需要大括号

jde*_*133 2 rust

里面的空结构Box::new()需要大括号吗?如果没有,有没有更喜欢的风格?

struct Empty;

// are these equivalent?

fn get_empty_box() -> Box<Empty> {
  Box::new(Empty)
}

fn get_empty_box_alt() -> Box<Empty> {
  Box::new(Empty {})
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*man 7

取决于它们是如何定义的。

如果它们被定义为struct Foo {}那么是的。

如果它们被定义为struct Foo();那么它们需要括号或大括号,但带大括号的情况并不常见。

如果它们被定义为struct Foo;那么它们不需要大括号(尽管它们可以接受它们)并且通常在没有大括号的情况下实例化。

其技术原因是struct Foo;,除了结构体本身之外,还定义了一个包含该结构体实例的同名常量。那是,const Foo: Foo = Foo {};。当你拼写时Foo不带大括号,你只需复制这个常量。

以类似的方式,元组结构体 ( struct Foo();) 除了结构体本身之外,还定义了一个实例化它的函数:fn Foo() -> Foo { Foo {} }。

  • @SilvioMayolo 是的:`struct Foo(i32); const F: Foo = Foo { 0: 42 };` :) (3认同)
  • @SilvioMayolo 不仅如此,它甚至与元组结构有语义差异。`let foo = Foo(&amp;temporary)` 会在句子末尾删除临时变量(这可能会导致问题),但 `let foo = Foo { 0: &amp;temporary }` 将它们扩展到作用域的末尾。 (2认同)