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);
}

Это работает, если вы можете безопасно получить доступ к UID &mut, но это деликатная операция. Вам следует избегать предоставления изменяемых ссылок на UID, если вы не уверены в последствиях.

Если ваше приложение использует только несколько известных типов структур, другое практическое решение — написать отдельную логику для каждого типа без использования дженериков.

Чтобы глубже понять, как работают динамические поля и как проектировать с учетом доступа к UID, я настоятельно рекомендую эту главу из книги Move Book: 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.

Кампания вознагражденийИюль