Bài viết
Chia sẻ kiến thức của bạn.
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
Câu trả lời
2Bạ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
Có hai điều bạn nên biết:
- 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.
- 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
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.
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.

- ... SUIBigSneh+1396
- ... SUISuiLover+1333
- ... SUI0xduckmove+1207
- ... SUIThorfin+1202
- ... SUIOwen+970
- ... SUIharry phan+847
- ... SUItheking+742
- Tại sao BCS yêu cầu thứ tự trường chính xác để khử chuỗi khi cấu trúc Move có các trường được đặt tên?53
- Nhiều lỗi xác minh nguồn” trong các ấn phẩm về mô-đun Sui Move - Giải quyết lỗi tự động43
- Giao dịch Sui thất bại: Đối tượng được dành riêng cho giao dịch khác25
- Làm thế nào để các ràng buộc về khả năng tương tác với các trường động trong các bộ sưu tập không đồng nhất?05