Suche…


Einführung

Die trivialste Datenstruktur ist nach einem singulären Wert das Tupel.

Syntax

  • (A, B, C) // ein Doppeltupel (ein Tupel mit drei Elementen), dessen erstes Element vom Typ A, vom zweiten Typ B und vom dritten Typ C ist
  • (A, B) // ein Zwei-Tupel, dessen zwei Elemente vom Typ A bzw. B sind
  • (A,) // ein Ein-Tupel (beachten Sie das nachgestellte , ), das nur ein einzelnes Element vom Typ A enthält
  • () // das leere Tupel, das sowohl ein Typ als auch das einzige Element dieses Typs ist

Tupel-Typen und Tupel-Werte

Rust-Tupel sind, wie in den meisten anderen Sprachen, Listen mit fester Größe, deren Elemente unterschiedliche Typen haben können.

// Tuples in Rust are comma-separated values or types enclosed in parentheses.
let _ = ("hello", 42, true);
// The type of a tuple value is a type tuple with the same number of elements.
// Each element in the type tuple is the type of the corresponding value element.
let _: (i32, bool) = (42, true);
// Tuples can have any number of elements, including one ..
let _: (bool,) = (true,);
// .. or even zero!
let _: () = ();
// this last type has only one possible value, the empty tuple ()
// this is also the type (and value) of the return value of functions
// that do not return a value ..
let _: () = println!("hello");
// .. or of expressions with no value.
let mut a = 0;
let _: () = if true { a += 1; };

Übereinstimmende Tupelwerte

Rust-Programme verwenden den Pattern-Matching weitgehend, um Werte zu dekonstruieren, egal ob match , if let oder let Muster dekonstruiert werden. Tupel können dekonstruiert werden, wie Sie es vielleicht mit einem match erwarten würden

fn foo(x: (&str, isize, bool)) {
    match x {
        (_, 42, _) => println!("it's 42"),
        (_, _, false) => println!("it's not true"),
        _ => println!("it's something else"),
    }
}

oder mit if let

fn foo(x: (&str, isize, bool)) {
    if let (_, 42, _) = x {
        println!("it's 42");
    } else {
        println!("it's something else");
    }
}

Sie können auch mit let -deconstruction im Tupel binden

fn foo(x: (&str, isize, bool)) {
    let (_, n, _) = x;
    println!("the number is {}", n);
}

Einblicke in Tupel

Um auf Elemente eines Tupels direkt zuzugreifen, können Sie mit dem Format .n auf das n te Element zugreifen

let x = ("hello", 42, true);
assert_eq!(x.0, "hello");
assert_eq!(x.1, 42);
assert_eq!(x.2, true);

Sie können sich auch teilweise aus einem Tupel herausbewegen

let x = (String::from("hello"), 42);
let (s, _) = x;
let (_, n) = x;
println!("{}, {}", s, n);
// the following would fail however, since x.0 has already been moved
// let foo = x.0;

Grundlagen

Ein Tupel ist einfach eine Verkettung mehrerer Werte:

  • möglicherweise verschiedener Typen
  • deren Anzahl und Typen statisch bekannt sind

Zum Beispiel ist (1, "Hello") ein 2-Elemente-Tupel, das aus i32 und a &str , und sein Typ wird auf ähnliche Weise als (i32, &'static str) als Wert bezeichnet.

Um auf ein Element eines Tupels zuzugreifen, verwendet man einfach seinen Index:

let tuple =  (1, "Hello");
println!("First element: {}, second element: {}", tuple.0, tuple.1);

Da das Tupel integriert ist, ist es auch möglich, Musterabgleich für Tupel zu verwenden:

match (1, "Hello") {
    (i, _) if i < 0 => println!("Negative integer: {}", i),
    (_, s) => println!("{} World", s),
}

Sonderfälle

Das 0-Element-Tupel: () wird auch als Einheit , Einheitentyp oder Singleton-Typ bezeichnet und bezeichnet das Fehlen sinnvoller Werte. Dies ist der Standardrückgabetyp von Funktionen (wenn -> nicht angegeben ist). Siehe auch: Welcher Typ ist der "Typ ()" in Rust? .

Das 1-Element-Tupel: (a,) mit dem nachgestellten Komma bezeichnet ein 1-Element-Tupel. Das Formular ohne Komma (a) wird als in Klammern eingeschlossener Ausdruck interpretiert und nur als a ausgewertet.

Und wenn wir gerade dabei sind, werden nachfolgende Kommas immer akzeptiert: (1, "Hello",) .


Einschränkungen

Die Sprache Rust unterstützt heutzutage keine Variadics , abgesehen von Tupeln. Daher ist es nicht möglich, ein Merkmal einfach für alle Tupel zu implementieren. Daher werden die Standardmerkmale nur für Tupel bis zu einer begrenzten Anzahl von Elementen implementiert (heute sind bis zu 12 enthalten). Tupel mit mehr Elementen werden unterstützt, implementieren jedoch nicht die Standardmerkmale (Sie können jedoch auch eigene Merkmale implementieren).

Diese Einschränkung wird in Zukunft hoffentlich aufgehoben.

Tupel auspacken

// It's possible to unpack tuples to assign their inner values to variables
let tup = (0, 1, 2);
// Unpack the tuple into variables a, b, and c
let (a, b, c) = tup;

assert_eq!(a, 0);
assert_eq!(b, 1);

// This works for nested data structures and other complex data types
let complex = ((1, 2), 3, Some(0));

let (a, b, c) = complex;
let (aa, ab) = a;

assert_eq!(aa, 1);
assert_eq!(ab, 2);


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow