sách gpt4 ăn đã đi

Thay đổi tham chiếu thành cấu trúc bên trong hoặc có thể thay đổi tham chiếu của tham chiếu trong Rust(Thay đổi tham chiếu thành cấu trúc bên trong hoặc có thể thay đổi tham chiếu của tham chiếu trong Rust)

dịch Tác giả: trợ lý lỗi Thời gian cập nhật: 26-10-2023 22:40:05 28 4
mua khóa gpt4 giày nike



Hiện tại tôi đang cố gắng dịch một chương trình C sang Rust.

Tôi đang cố dịch chương trình C sang Rust.


Chương trình C có các cấu trúc sau (thu gọn thành MRE):

Một chương trình C có cấu trúc sau (gọi tắt là MRE):


Kiểu định nghĩa cấu trúc {
bool làHoạt động;
giá trị uint32_t;
} tMyInnerStruct;

Kiểu định nghĩa cấu trúc {
tMyInnerStruct bên trong1;
tMyInnerStruct bên trong2;
} tMyStruct;

và trong một hàm tôi sẽ thực hiện phép thuật con trỏ sau:

Trong một hàm, tôi sẽ thực hiện phép thuật con trỏ sau:


hàm myFunction() không có giá trị
{
tMyStruct myStruct = initMyStuct();
tMyInnerStruct *pActiveInner = &myStruct.inner1;
// Thực hiện một số thao tác với pActiveInner (trỏ tới inner1), như thiết lập giá trị...
thay đổiActiveStruct(&myStruct, &pActiveInner);
// Thực hiện một số thao tác với pActiveInner (trỏ tới inner2), như thiết lập giá trị...
}

void changeActiveStruct( tMyStruct *pMyStruct, tMyInnerStruct **ppActiveInner )
{
nếu ( &pMyStruct->inner1 == *ppActiveInner ) {
*ppActiveInner = &pMyStruct->inner2;
} khác {
*ppActiveInner = &pMyStruct->inner1;
}
}

Không, câu hỏi của tôi là: Làm sao tôi có thể đạt được điều tương tự trong Rust?

Không, câu hỏi của tôi là: Làm cách nào để đạt được mục tiêu tương tự trong Rust?


Những gì tôi đã thử cho đến nay trong Rust:

Những gì tôi đã thử cho đến nay ở Rust là:


#[derive(Mặc định)]
cấu trúc MyInnerStruct {
is_active: bool,
giá trị: u32,
}

#[derive(Mặc định)]
cấu trúc MyStruct {
inner1: MyInnerStruct,
inner2: MyInnerStruct,
}

triển khai MyStruct {
fn change_active(&mut self, active: &MyInnerStruct) -> &mut MyInnerStruct {
nếu &self.inner1 là *const _ == hoạt động là *const _ {
&mut bản thân.bên trong2
} khác {
&mut bản thân.bên trong1
}
}
}

fn chính() {
hãy thay đổi my_struct: MyStruct = Default::default();
hãy để mut active = &mut my_struct.inner1;
hoạt động = my_struct.change_active(hoạt động);
// Câu trên phàn nàn rằng my_struct không thể được mượn có thể thay đổi nhiều hơn một lần...
}

Thêm câu trả lời
Khuyến nghị câu trả lời tuyệt vời

Bạn có thể biên dịch cùng một thứ bằng cách sử dụng con trỏ làm đối số thay vì tham chiếu. Do thứ tự mà các đối số và bộ thu được đánh giá, bạn phải chuyển đổi thành con trỏ trước khi gọi và không thể thực hiện trong danh sách tham số nhưng cách này có hiệu quả:

Bạn có thể biên dịch điều tương tự bằng cách sử dụng con trỏ làm tham số thay vì tham chiếu. Do thứ tự đánh giá các đối số và bộ thu, bạn phải truyền tới một con trỏ trước cuộc gọi và bạn không thể thực hiện việc này trong danh sách đối số, nhưng cách này có tác dụng:


triển khai MyStruct {
fn change_active(&mut self, active: *const MyInnerStruct) -> &mut MyInnerStruct {
nếu &self.inner1 là *const _ == hoạt động {
&mut bản thân.bên trong2
} khác {
&mut bản thân.bên trong1
}
}
}

fn chính() {
hãy thay đổi my_struct: MyStruct = Default::default();
hãy để mut active = &mut my_struct.inner1;

hoạt động = {
hãy để active = active như *const _;
my_struct.change_active(hoạt động)
};
}

Sân chơi

sân chơi




Chi tiết nhỏ, thay đổi_hoạt động không còn có vẻ là một cái tên phù hợp nữa vì phiên bản Rust thực sự không thay đổi tích cực Có lẽ new_active hoặc cái gì đó khác vẫn là cái tên tốt hơn cho phương pháp này

Chi tiết nhỏ, CHANGE_ACTIVE không còn giống một tên thích hợp nữa vì các phiên bản Rust không thực sự thay đổi ACTIVE có thể là NEW_ACTIVE hoặc tên nào khác vẫn là tên tốt hơn cho phương thức


Thêm câu trả lời

Cảm ơn, đây chính là những gì tôi đang tìm kiếm :-) Cast trong quá trình so sánh đã là một gợi ý, nhưng tôi không quen với các con trỏ trong Rust. Theo tôi, nhược điểm duy nhất là shadowing có phạm vi của biến hoạt động, vì nó không phải là một dòng lệnh ;-)

Cảm ơn, đó chính là điều tôi đang tìm kiếm :-) Việc chọn lựa trong phần so sánh đã là một gợi ý, nhưng tôi không quen lắm với các con trỏ trong Rust. Theo tôi, nhược điểm duy nhất là theo dõi phạm vi của các biến hoạt động, vì nó không phải là một lớp lót ;-)

28 4 0
trợ lý lỗi
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress