Sui.

Допис

Діліться своїми знаннями.

HaGiang.
Apr 30, 2025
Питання та відповіді експертів

чи є спосіб вирішити такий тип проблеми?

Я працюю над модулем Move і стикаюся з помилкою типу під час спроби передати поле загальної структури у функцію. Ось спрощена версія того, що я маю:

  • Sui
3
2
Поділитися
Коментарі
.

Відповіді

2
harry phan.
Apr 30 2025, 03:19

Ви стикаєтесь із обмеженням, яке насправді є дизайном у 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

4
Найкраща відповідь
Коментарі
.
0xduckmove.
Apr 30 2025, 03:23

Є дві речі, які ви повинні знати:

  1. Доступ до полів можна отримати лише в модулі, який визначає структуру. Таким чином, навіть без загальних ви не змогли б отримати доступ до полів для іноземного типу.
  2. Я думаю, що я розумію, звідки ви родом: key forces id: UID field, але це лише додаткове «правило верифікатора», а не підказка для компілятора. Іншими словами, компілятор не знає, що T має будь-які поля, і не повинен знати
3
Коментарі
.

Ви знаєте відповідь?

Будь ласка, увійдіть та поділіться нею.

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

610Пости1335Відповіді
Sui.X.Peera.

Зароби свою частку з 1000 Sui

Заробляй бали репутації та отримуй винагороди за допомогу в розвитку спільноти Sui.

Кампанія винагородЛипень