Publicación
Comparte tu conocimiento.
¿hay alguna forma de resolver este tipo de problema?
Estoy trabajando en un módulo Move y me encuentro con un error de tipo al intentar pasar un campo de una estructura genérica a una función. Esta es una versión simplificada de lo que tengo:
- Sui
Respuestas
2Te encuentras con una limitación que, de hecho, está diseñada en Move. Incluso si tu tipo genérico T está restringido a la clave + store, el compilador sigue sin saber nada sobre los campos que contiene T. La habilidad de las claves solo garantiza que T incluya un UID, pero es más bien una regla del sistema de tipos, no una forma de que el compilador deduzca la estructura. Por lo tanto, el hecho de que T tenga un campo de identificación no es algo en lo que puedas confiar en tiempo de compilación.
También es importante: el acceso a los campos en Move está restringido al módulo en el que está definida la estructura. Por lo tanto, aunque T no fuera genérico, si proviene de otro módulo, no podrías acceder a sus campos directamente.
Lo que estás intentando hacer (pasar &mut my_obj.id desde un objeto genérico) no es posible y es intencional. Protege las variables clave de Move, especialmente en lo que respecta a la seguridad de los UID. Permitir el acceso genérico y mutable a campos como el UID infringiría las principales garantías de seguridad del lenguaje.
Si tu objetivo es usar df: :add e intentas adjuntar un campo al UID del objeto, tendrás que reestructurar tu código. Una forma es omitir por completo lo genérico y escribir:
public fun add_df(uid: &mut UID, new_id: ID) {
df::add(uid, b"aaa".to_string(), new_id);
}
Esto funciona si puedes acceder de forma segura al UID de &mut, pero se trata de una operación delicada: debes evitar exponer referencias mutables al UID a menos que estés absolutamente seguro de las implicaciones.
Si tu app solo usa unos pocos tipos de estructuras conocidas, otra solución práctica es escribir una lógica separada por tipo, sin usar genéricos.
Para profundizar en el funcionamiento de los campos dinámicos y en cómo diseñar teniendo en cuenta el acceso a los UID, te recomiendo encarecidamente este capítulo del Move Book: https://move-book.com/programmability/dynamic-fields.html#dynamic-fields
Hay dos cosas que debes saber:
- Solo se puede acceder a los campos en el módulo que define la estructura. Por lo tanto, incluso sin genéricos, no podría acceder a los campos de un tipo extranjero.
- Creo que entiendo de dónde vienes: key force id: campo UID, pero es solo una «regla de verificación» adicional, y no una sugerencia para el compilador. En otras palabras, el compilador no sabe que T tiene ningún campo y se supone que no debe saberlo
Sabes la respuesta?
Inicie sesión y compártalo.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Gana tu parte de 1000 Sui
Gana puntos de reputación y obtén recompensas por ayudar a crecer a la comunidad de Sui.

- ... SUIBigSneh+1396
- ... SUISuiLover+1333
- ... SUI0xduckmove+1207
- ... SUIThorfin+1202
- ... SUIOwen+970
- ... SUIharry phan+847
- ... SUItheking+742
- ¿Por qué BCS requiere un orden de campo exacto para la deserialización cuando las estructuras Move tienen campos con nombre?53
- «Errores de verificación de múltiples fuentes» en las publicaciones del módulo Sui Move: resolución automática de errores43
- Fallo en la transacción Sui: objetos reservados para otra transacción25
- ¿Cómo interactúan las restricciones de capacidad con los campos dinámicos en colecciones heterogéneas?05