Types 枚举与结构类型名称在Rust中如何工作?

Types 枚举与结构类型名称在Rust中如何工作?,types,struct,enums,rust,Types,Struct,Enums,Rust,我刚开始学习Rust,并注意到以下代码可以工作,即使枚举内的各种选项似乎传播到枚举外,因此与结构位于同一名称空间中: enumfoobar{Foo(int),Bar(uint)} 结构Foo{Foo:int} 结构条{Bar:uint} 但是,这会导致编译器错误: enum FooBar { Foo(int), Bar(uint) } enum BarBaz { Bar(uint), Baz(f32) } 结构和枚举似乎生活在各自的平行宇宙中。如果能解释一下struct和enum类型名在Ru

我刚开始学习Rust,并注意到以下代码可以工作,即使枚举内的各种选项似乎传播到枚举外,因此与结构位于同一名称空间中:

enumfoobar{Foo(int),Bar(uint)}
结构Foo{Foo:int}
结构条{Bar:uint}
但是,这会导致编译器错误:

enum FooBar { Foo(int), Bar(uint) }
enum BarBaz { Bar(uint), Baz(f32) }
结构和枚举似乎生活在各自的平行宇宙中。如果能解释一下struct和enum类型名在Rust中是如何工作的,以及为什么会产生这种效果,我将不胜感激


此外,现有类型(即结构)是否可以作为枚举中的选项之一?

这里有两个名称空间,用于值的名称空间和用于结构构造函数的名称空间

枚举变量构造函数是函数,因此位于值命名空间中,例如,您可以编写
let f:fn(uint)->FooBar=Foo;foo(1)
。在同一范围内声明两个相同的函数是不合法的(如何区分它们?)

结构构造函数不是函数或值,例如,不能将它们赋给上述变量,这意味着仍然可以区分哪个名称的含义,因为它们在不同的上下文中使用。因此,没有必要禁止在两个名称空间中使用名称

你可以用Foo{Foo:42}搞乱=Foo(42)


我不这么认为。。。至少它们是不同的类型,因此在大多数情况下,编译器会向您抱怨类型不匹配。

Rust的枚举是标记的联合,而
Foo
Bar
Baz
是构造函数。Rust的结构是记录,字段名为
foo
bar
。它们属于不同的名称类别(或名称空间)。@Rhymoid仍然觉得这个设计选择很奇怪。你可以很容易地把=Foo(42)和Foo{Foo:42}搞砸……没错。当一个人试图在一种新语言中加入“熟悉的”(但不完整的)C概念,同时又试图将其与现代思想相结合时,就会发生这种情况。