Sui.

Publication

Partagez vos connaissances.

HaGiang.
Apr 30, 2025
Questions et Réponses avec des Experts

existe-t-il un moyen de résoudre ce type de problème ?

Je travaille sur un module Move et je rencontre une erreur de type lorsque j'essaie de transmettre un champ d'une structure générique à une fonction. Voici une version simplifiée de ce que j'ai :

  • Sui
3
2
Partager
Commentaires
.

Réponses

2
harry phan.
Apr 30 2025, 03:19

Vous vous heurtez à une limitation qui est en fait intentionnelle dans Move. Même si votre type générique T est limité par key + store, le compilateur ne sait toujours rien des champs contenus dans T. La capacité key garantit simplement que T inclut un UID, mais il s'agit plutôt d'une règle de système de types, et non d'un moyen pour le compilateur de déduire une structure. Donc, T ayant un champ id n'est pas quelque chose sur lequel vous pouvez compter au moment de la compilation.

Également important : l'accès aux champs dans Move est limité au module dans lequel la structure est définie. Ainsi, même si T n'était pas générique, s'il provient d'un autre module, vous ne pourriez toujours pas accéder directement à ses champs.

Ce que vous essayez de faire, à savoir transmettre &mut my_obj.id à partir d'un objet générique, n'est pas possible, et c'est intentionnel. Il protège les invariants clés dans Move, en particulier en ce qui concerne la sécurité de l'UID. Autoriser un accès mutable générique à des champs tels que l'UID violerait les garanties de sécurité fondamentales du langage.

Si votre objectif est d'utiliser df : :add et que vous essayez de joindre un champ à l'UID de l'objet, vous devrez restructurer votre code. Une solution consiste à contourner complètement le générique et à écrire :

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

Cela fonctionne si vous pouvez accéder en toute sécurité à l'UID &mut, mais il s'agit d'une opération délicate. Vous devez éviter d'exposer des références mutables à l'UID à moins d'être absolument sûr des implications.

Si votre application n'utilise que quelques types de structures connus, une autre solution pratique consiste à écrire une logique distincte par type, sans utiliser de génériques.

Pour en savoir plus sur le fonctionnement des champs dynamiques et sur la manière de concevoir en fonction de l'accès UID, je recommande vivement ce chapitre du Move Book : https://move-book.com/programmability/dynamic-fields.html#dynamic-fields

4
Meilleure réponse
Commentaires
.
0xduckmove.
Apr 30 2025, 03:23

Il y a deux choses que vous devez savoir :

  1. Les champs ne sont accessibles que dans le module qui définit la structure. Ainsi, même sans générique, vous ne pourriez pas accéder aux champs d'un type étranger.
  2. Je pense comprendre d'où vous venez : key forces id : champ UID, mais il ne s'agit que d'une « règle de vérification » supplémentaire, et non d'un indice pour le compilateur. En d'autres termes, le compilateur ne sait pas que T possède des champs et n'est pas censé le savoir
3
Commentaires
.

Connaissez-vous la réponse ?

Veuillez vous connecter et la partager.

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

610Publications1335Réponses
Sui.X.Peera.

Gagne ta part de 1000 Sui

Gagne des points de réputation et obtiens des récompenses pour avoir aidé la communauté Sui à se développer.

Campagne de RécompensesJuillet