Verweistypen

Abgeschlossen

Beim Schreiben von Verträgen sollten Sie auch Verweistypen verstehen.

Im Gegensatz zu Werttypen, die immer eine unabhängige Kopie des Werts übergeben, geben Verweistypen einen Datenspeicherort für den Wert an. Es gibt die folgenden drei Verweistypen: structs, arrays, and mappings (Strukturen, Arrays und Zuordnungen).

Speicherort der Daten

Wenn Sie einen Verweistyp verwenden, müssen Sie den Datenspeicherort explizit für den Typ angeben. Sie können die folgenden Optionen verwenden, um den Datenspeicherort anzugeben, an dem der Typ gespeichert wird:

  • memory:
    • Gibt den Speicherort an, an dem die Funktionsargumente gespeichert werden
    • Dieser hat eine Lebensdauer, die auf die Lebensdauer eines externen Funktionsaufrufs begrenzt ist.
  • storage:
    • Gibt den Speicherort an, an dem die Zustandsvariablen gespeichert werden
    • Die Lebensdauer ist auf die Lebensdauer der Vertrags beschränkt.
  • calldata:
    • Gibt den Speicherort an, an dem die Funktionsargumente gespeichert werden
    • Dieser Speicherort ist für die Parameter von externen Funktionen erforderlich, kann aber auch für andere Variablen verwendet werden.
    • Dieser hat eine Lebensdauer, die auf die Lebensdauer eines externen Funktionsaufrufs begrenzt ist.

Verweistypen erstellen immer eine unabhängige Kopie der Daten.

Hier sehen Sie ein Beispiel für die Verwendung eines Verweistyps:

contract C {

  uint[] x;
  
  // the data location of values is memory
  function buy(uint[] memory values) public {
      x = values; // copies array to storage
      uint[] storage y = x; //data location of y is storage
      g(x); // calls g, handing over reference to x
      h(x); // calls h, and creates a temporary copy in memory
  }

  function g(uint[] storage) internal pure {}
  function h(uint[] memory) public pure {}
}

Arrays

Arrays stellen eine Möglichkeit zum Speichern ähnlicher Daten in einer festgelegten Datenstruktur dar. Arrays können eine feste oder dynamische Größe aufweisen. Ihre Indizes beginnen bei 0 (null).

Zum Erstellen eines Arrays mit der festen Größe k und dem Elementtyp T müssten Sie T[k] schreiben. Für ein Array mit dynamischer Größe würden Sie Folgendes schreiben: T[].

Arrayelemente können einen beliebigen Typ aufweisen. Sie können beispielsweise die Typen uint, memory oder bytes enthalten. Darüber hinaus können Arrays Zuordnungen oder Strukturen enthalten.

Die folgenden Beispiele veranschaulichen die Erstellung von Arrays:

uint[] itemIds; // Declare a dynamically sized array called itemIds
uint[3] prices = [1, 2, 3]; // initialize a fixed size array called prices, with prices 1, 2, and 3
uint[] prices = [1, 2, 3]; // same as above

Array members (Arraymember)

Die folgenden Member können Informationen über Arrays ändern und abrufen:

  • length: Ruft die Länge eines Arrays ab.
  • push(): Fügt ein Element am Ende eines Arrays hinzu.
  • pop: Entfernt ein Element vom Ende eines Arrays.

Im Folgenden finden Sie einige Beispiele:

// Create a dynamic byte array
bytes32[] itemNames;
itemNames.push(bytes32("computer")); // adds "computer" to the array
itemNames.length; // 1

Strukturen

Strukturen (Structs) sind benutzerdefinierte Typen, die ein Benutzer definieren kann, um reale Objekte darzustellen. Strukturen werden in der Regel als Schema oder zum Darstellen von Datensätzen verwendet.

Beispiel für eine Strukturdeklaration:

struct Items_Schema {
    uint256 _id;
    uint256 _price;
    string _name;
    string _description;
}

Zuordnungstypen

Zuordnungen sind Schlüssel-Wert-Paare, die gemeinsam gekapselt oder gepackt werden. Zuordnungen ähneln Wörterbüchern oder Objekten in JavaScript. In der Regel verwenden Sie Zuordnungen, um reale Objekte zu modellieren und Datensuchen schneller durchzuführen. Die Werte können komplexe Typen wie Strukturen enthalten, wodurch der Zuordnungstyp flexibel und für Menschen lesbar ist.

Im folgenden Codebeispiel wird die Struktur Items_Schema verwendet und eine Liste der von Items_Schema dargestellten Elementen als Wörterbuch gespeichert. Auf diese Weise imitiert die Zuordnung eine Datenbank.

contract Items {
    uint256 item_id = 0;

    mapping(uint256 => Items_Schema) public items;

    struct Items_Schema {
      uint256 _id:
      uint256 _price:
      string _name;
    }

    function listItem(uint256 memory _price, string memory _name) public {
      items[item_id] = Items_Schema(item_id, _price, _name);
      item_id += 1;
    }
}

Hinweis

Die Zuordnungssignatur uint256 => Items_Schema gibt an, dass die Schlüssel einen nicht signierten Integer darstellen und die Werte einen Items_Schema-Strukturtyp aufweisen.