Sui.

Beitrag

Teile dein Wissen.

HaGiang.
Apr 30, 2025
Experten Q&A

Gibt es eine Möglichkeit, diese Art von Problem zu lösen?

Ich arbeite an einem Move-Modul und stoße auf einen Typfehler, wenn ich versuche, ein Feld einer generischen Struktur an eine Funktion zu übergeben. Hier ist eine vereinfachte Version von dem, was ich habe:

  • Sui
3
2
Teilen
Kommentare
.

Antworten

2
harry phan.
Apr 30 2025, 03:19

Sie stoßen in Move auf eine Einschränkung, die eigentlich beabsichtigt ist. Selbst wenn Ihr generischer Typ T durch Schlüssel + store eingeschränkt ist, weiß der Compiler immer noch nichts über die Felder in T. Die Schlüsselfähigkeit stellt nur sicher, dass T eine UID enthält, aber es handelt sich eher um eine Typsystemregel, nicht um eine Möglichkeit für den Compiler, die Struktur abzuleiten. Wenn T also ein ID-Feld hat, können Sie sich bei der Kompilierung nicht darauf verlassen.

Ebenfalls wichtig: Der Feldzugriff in Move ist auf das Modul beschränkt, in dem die Struktur definiert ist. Selbst wenn T nicht generisch wäre, könnten Sie, wenn es aus einem anderen Modul stammt, immer noch nicht direkt auf seine Felder zugreifen.

Was Sie versuchen zu tun — &mut my_obj.id von einem generischen Objekt zu übergeben — ist nicht möglich, und das ist beabsichtigt. Es schützt wichtige Invarianten in Move, insbesondere in Bezug auf die UID-Sicherheit. Den generischen veränderbaren Zugriff auf Felder wie UID zu erlauben, würde gegen die wichtigsten Sicherheitsgarantien der Sprache verstoßen.

Wenn es Ihr Ziel ist, df: :add zu verwenden, und Sie versuchen, ein Feld an die UID des Objekts anzuhängen, müssen Sie Ihren Code umstrukturieren. Eine Möglichkeit besteht darin, das Generikum vollständig zu umgehen und zu schreiben:

public fun add_df(uid: &mut UID, new_id: ID) {
    df::add(uid, b"aaa".to_string(), new_id);
}

Das funktioniert, wenn Sie sicher auf die &mut-UID zugreifen können, aber das ist ein sensibler Vorgang — Sie sollten vermeiden, veränderbare Verweise auf die UID preiszugeben, es sei denn, Sie sind sich der Auswirkungen absolut sicher.

Wenn Ihre App nur wenige bekannte Strukturtypen verwendet, besteht eine andere praktische Lösung darin, für jeden Typ eine separate Logik zu schreiben, ohne Generics zu verwenden.

Um tiefer in die Funktionsweise dynamischer Felder und das Design rund um den UID-Zugriff einzutauchen, empfehle ich dieses Kapitel aus dem Move Book: https://move-book.com/programmability/dynamic-fields.html#dynamic-fields

4
Beste Antwort
Kommentare
.
0xduckmove.
Apr 30 2025, 03:23

Es gibt zwei Dinge, die Sie wissen sollten:

  1. Auf Felder kann nur in dem Modul zugegriffen werden, das die Struktur definiert. Selbst ohne Generic könnten Sie also nicht auf die Felder für einen Fremdtyp zugreifen.
  2. Ich glaube, ich verstehe, woher Sie kommen: key forces id: UID-Feld, aber es ist nur eine zusätzliche „Verifier-Regel“ und kein Hinweis für den Compiler. Mit anderen Worten, der Compiler weiß nicht, dass T irgendwelche Felder hat und sollte es auch nicht wissen
3
Kommentare
.

Weißt du die Antwort?

Bitte melde dich an und teile sie.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

610Beiträge1335Antworten
Sui.X.Peera.

Verdiene deinen Anteil an 1000 Sui

Sammle Reputationspunkte und erhalte Belohnungen für deine Hilfe beim Wachstum der Sui-Community.

BelohnungskampagneJuli