Пост
Поделитесь своими знаниями.
есть ли способ решить эту проблему?
Я работаю над модулем 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);
}
Это работает, если вы можете безопасно получить доступ к UID &mut, но это деликатная операция. Вам следует избегать предоставления изменяемых ссылок на UID, если вы не уверены в последствиях.
Если ваше приложение использует только несколько известных типов структур, другое практическое решение — написать отдельную логику для каждого типа без использования дженериков.
Чтобы глубже понять, как работают динамические поля и как проектировать с учетом доступа к UID, я настоятельно рекомендую эту главу из книги Move Book: 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