Допис
Діліться своїми знаннями.
чи є спосіб вирішити такий тип проблеми?
Я працюю над модулем Move і стикаюся з помилкою типу під час спроби передати поле загальної структури у функцію. Ось спрощена версія того, що я маю:
- Sui
Відповіді
2Ви стикаєтесь із обмеженням, яке насправді є дизайном у Move. Навіть якщо ваш загальний тип T обмежений ключем + сховищем, компілятор все ще нічого не знає про поля всередині T. Здатність ключа просто гарантує, що T включає UID, але це скоріше системне правило типу, а не спосіб для компілятора зробити висновок про структуру. Отже, наявність поля id - це не те, на що ви можете покластися під час компіляції.
Також важливо: доступ до поля в Move обмежений модулем, де визначена структура. Тож навіть якби T не був загальним, якщо він походить з іншого модуля, ви все одно не зможете отримати доступ до його полів безпосередньо.
Те, що ви намагаєтесь зробити — передати &mut my_obj.id від загального об'єкта — неможливо, і це навмисно. Він захищає ключові інваріанти в Move, особливо навколо безпеки UID. Дозвіл загального змінюваного доступу до полів, таких як UID, порушить основні гарантії безпеки в мові.
Якщо ваша мета - використовувати df: :add, і ви намагаєтеся прикріпити поле до UID об'єкта, вам потрібно буде реструктуризувати код. Один із способів - повністю обійти загальне і написати:
public fun add_df(uid: &mut UID, new_id: ID) {
df::add(uid, b"aaa".to_string(), new_id);
}
Це працює, якщо ви можете безпечно отримати доступ до & mut UID, але це чутлива операція - вам слід уникати викриття змінних посилань на UID, якщо ви не впевнені в наслідках.
Якщо ваш додаток використовує лише кілька відомих типів структур, іншим практичним рішенням є написання окремої логіки для кожного типу, без використання дженериків.
Щоб глибше зануритися в те, як працюють динамічні поля та як проектувати доступ до UID, я настійно рекомендую цей розділ із книги переміщення: https://move-book.com/programmability/dynamic-fields.html#dynamic-fields
Є дві речі, які ви повинні знати:
- Доступ до полів можна отримати лише в модулі, який визначає структуру. Таким чином, навіть без загальних ви не змогли б отримати доступ до полів для іноземного типу.
- Я думаю, що я розумію, звідки ви родом: key forces id: UID field, але це лише додаткове «правило верифікатора», а не підказка для компілятора. Іншими словами, компілятор не знає, що T має будь-які поля, і не повинен знати
Ви знаєте відповідь?
Будь ласка, увійдіть та поділіться нею.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Зароби свою частку з 1000 Sui
Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.

- ... SUIBigSneh+1396
- ... SUISuiLover+1333
- ... SUI0xduckmove+1207
- ... SUIThorfin+1202
- ... SUIOwen+970
- ... SUIharry phan+847
- ... SUItheking+742
- Чому BCS вимагає точного порядку полів для десеріалізації, коли структури Move мають названі поля?53
- Помилки перевірки кількох джерел» у публікаціях модуля Sui Move - автоматичне вирішення помилок43
- Невдала операція Sui: об'єкти, зарезервовані для іншої транзакції25
- Як обмеження здібностей взаємодіють з динамічними полями в гетерогенних колекціях?05