Beitrag
Teile dein Wissen.
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
Antworten
2Sie 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
Es gibt zwei Dinge, die Sie wissen sollten:
- 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.
- 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
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.
Verdiene deinen Anteil an 1000 Sui
Sammle Reputationspunkte und erhalte Belohnungen für deine Hilfe beim Wachstum der Sui-Community.

- ... SUIBigSneh+1396
- ... SUISuiLover+1333
- ... SUI0xduckmove+1207
- ... SUIThorfin+1202
- ... SUIOwen+970
- ... SUIharry phan+847
- ... SUItheking+742
- Warum benötigt BCS eine genaue Feldreihenfolge für die Deserialisierung, wenn Move-Strukturen benannte Felder haben?53
- Fehler bei der Überprüfung mehrerer Quellen“ in den Veröffentlichungen des Sui Move-Moduls — Automatisierte Fehlerbehebung43
- Sui-Transaktion schlägt fehl: Objekte sind für eine andere Transaktion reserviert25
- Wie interagieren Fähigkeitsbeschränkungen mit dynamischen Feldern in heterogenen Sammlungen?05