Sui.

Bài viết

Chia sẻ kiến thức của bạn.

HaGiang.
Apr 30, 2025
Hỏi đáp Chuyên Gia

có cách nào để giải quyết loại vấn đề này không?

Tôi đang làm việc trên mô-đun Move và gặp lỗi kiểu khi cố gắng truyền một trường của cấu trúc chung vào một hàm. Đây là một phiên bản đơn giản của những gì tôi có:

  • Sui
3
2
Chia sẻ
Bình luận
.

Câu trả lời

2
harry phan.
Apr 30 2025, 03:19

Bạn đang gặp phải một giới hạn thực sự là do thiết kế trong Move. Ngay cả khi kiểu chung T của bạn bị ràng buộc với key + store, trình biên dịch vẫn không biết gì về các trường bên trong T. Khả năng khóa chỉ đảm bảo rằng T bao gồm một UID, nhưng nó giống như một quy tắc hệ thống kiểu, không phải là một cách để trình biên dịch suy ra cấu trúc. Vì vậy, T có một trường id không phải là thứ bạn có thể dựa vào tại thời điểm biên dịch.

Cũng quan trọng: quyền truy cập trường trong Move bị giới hạn trong mô-đun nơi cấu trúc được xác định. Vì vậy, ngay cả khi T không chung chung, nếu nó đến từ một mô-đun khác, bạn vẫn sẽ không thể truy cập trực tiếp các trường của nó.

Những gì bạn đang cố gắng làm - truyền & mut my_obj.id từ một đối tượng chung - là không thể thực hiện được, và đó là cố ý. Nó bảo vệ các bất biến chính trong Move, đặc biệt là xung quanh sự an toàn của UID. Cho phép truy cập có thể thay đổi chung vào các trường như UID sẽ vi phạm các đảm bảo bảo mật cốt lõi trong ngôn ngữ.

Nếu mục tiêu của bạn là sử dụng df: :add và bạn đang cố gắng đính kèm một trường vào UID của đối tượng, bạn sẽ cần phải cấu trúc lại mã của mình. Một cách là bỏ qua hoàn toàn phần chung và viết:

public fun add_df(uid: &mut UID, new_id: ID) {
    df::add(uid, b"aaa".to_string(), new_id);
}

Điều này hoạt động nếu bạn có thể truy cập UID & mut một cách an toàn, nhưng đó là một thao tác nhạy cảm - bạn nên tránh để lộ các tham chiếu có thể thay đổi cho UID trừ khi bạn hoàn toàn chắc chắn về hàm ý.

Nếu ứng dụng của bạn chỉ sử dụng một vài kiểu cấu trúc đã biết, một giải pháp thực tế khác là viết logic riêng biệt cho mỗi loại, mà không sử dụng generics.

Để tìm hiểu sâu hơn về cách hoạt động của các trường động và cách thiết kế xung quanh quyền truy cập UID, tôi thực sự giới thiệu chương này từ Move Book: https://move-book.com/programmability/dynamic-fields.html#dynamic-fields

4
Câu trả lời hay nhất
Bình luận
.
0xduckmove.
Apr 30 2025, 03:23

Có hai điều bạn nên biết:

  1. Các trường chỉ có thể được truy cập trong mô-đun xác định cấu trúc. Vì vậy, ngay cả khi không có chung chung, bạn sẽ không thể truy cập các trường cho một loại nước ngoài.
  2. Tôi nghĩ rằng tôi không hiểu bạn đến từ đâu: key force id: UID field, nhưng đó chỉ là một “quy tắc xác minh” bổ sung và không phải là một gợi ý cho trình biên dịch. Nói cách khác, trình biên dịch không biết rằng T có bất kỳ trường nào và không được cho là biết
3
Bình luận
.

Bạn có biết câu trả lời không?

Hãy đăng nhập và chia sẻ nó.

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

610Bài viết1335Câu trả lời
Sui.X.Peera.

Kiếm phần của bạn từ 1000 Sui

Tích lũy điểm danh tiếng và nhận phần thưởng khi giúp cộng đồng Sui phát triển.

Chiến dịch phần thưởngTháng Bảy