在 Rust 中,为什么“元组结构体”被称为“命名元组”?

7
根据这里的内容:

元组结构体,基本上是带有名称的元组。

// A tuple struct
struct Pair(i32, f32);

在代码的后面
// Instantiate a tuple struct
let pair = Pair(1, 0.1);

// Access the fields of a tuple struct
println!("pair contains {:?} and {:?}", pair.0, pair.1);

如果这是一个“命名元组”,为什么我要使用.0.1来访问它?这与“普通元组”有何不同?
let pair = (1, 0.1);
println!("pair contains {:?} and {:?}", pair.0, pair.1);

在Python中,命名元组具有名称,并且允许通过索引访问。

from collections import namedtuple

Pair = namedtuple('Pair', ['x', 'y'])
pair = Pair(1, 0.1)

print(pair[0], pair[1])  # 1 0.1
print(pair.x, pair.y)  # 1 0.1

所以问题是,在上面的rust示例中,“命名元组”中的“名称”是什么?对我来说,“经典的C结构体”(在同一个链接中)听起来像一个“命名元组”,因为如果我将结构体(Pair)初始化为这样,我可以使用.x.y访问它。我无法从链接中理解这一点。


7
对于“命名元组”(named tuple)而言,元组本身是有名称的(这里是“Pair”),但它的字段没有名称。这与普通元组不同,普通元组中没有任何名称,而普通结构体中既有结构体名称,也有字段名称。而在Python中,这种情况则有所不同。这就是命名规范的生活。 - Caesar
@Caesar,所以只是将一个元组分类到一个表单中,并用一个名称引用该分类的元组吗? - Valencia
3
大致是这样的,但我不确定“categorizing”是否是正确的词。命名元组实际上是它自己的类型,与具有相同类型字段的任何其他元组或结构不同。(例如,将其与一个类型别名 type Pair = (i32, f32); 进行比较。) - Caesar
1个回答

12

元组结构体,基本上是命名元组。

被命名的并不是实例或成员,而是整个类型。

那和“普通元组”有什么不同?

接受元组结构体的函数将不会接受常规元组,反之亦然。

struct Named(f32,i32);
fn accepts_tuple(t:(f32,i32)) { todo!(); }
fn accepts_named(t:Named) { todo!(); }

fn main() {
  let t = (1.0f32, 1i32);
  accepts_tuple(t); // OK
  // accepts_named(t); // Does not compile
  let n=Named(1.0f32, 1i32);
  // accepts_tuple(n); // Does not compile
  accepts_named(n); // OK
}

2
谢谢您的回答,所以命名元组只是(可能是许多中的一种)强制类型的手段? - Valencia

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