为什么 Rust 中的“元组结构”被称为“命名元组”

Val*_*cia 9 struct tuples rust

按照这个

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

// A tuple struct
struct Pair(i32, f32);
Run Code Online (Sandbox Code Playgroud)

稍后在代码中

// 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);
Run Code Online (Sandbox Code Playgroud)

如果这是一个“命名元组”,为什么我要使用.0and访问它.1?这与“普通元组”有什么不同?

let pair = (1, 0.1);
println!("pair contains {:?} and {:?}", pair.0, pair.1);
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*son 13

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

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

这与“普通元组”有什么不同?

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

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
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答,那么命名元组只是(可能是众多)强制类型的方法? (2认同)