Về cơ bản, có hai phần cho câu hỏi này:Có thể khai báo các biến theo thủ tục sử dụng các macro Rust không?
Bạn có thể vượt qua một định danh không biết đến một macro trong Rust?
Bạn có thể kết hợp các chuỗi để tạo tên biến mới trong macro Rust không? !
Ví dụ, một cái gì đó như:
macro_rules! expand(
($x:ident) => (
let mut x_$x = 0;
)
)
Calling mở rộng (hi) rõ ràng thất bại vì hi là một định danh chưa biết; nhưng bạn có thể bằng cách nào đó làm điều này?
tức là. Tương đương trong C của một cái gì đó như:
#include <stdio.h>
#define FN(Name, base) \
int x1_##Name = 0 + base; \
int x2_##Name = 2 + base; \
int x3_##Name = 4 + base; \
int x4_##Name = 8 + base; \
int x5_##Name = 16 + base;
int main() {
FN(hello, 10)
printf("%d %d %d %d %d\n", x1_hello, x2_hello, x3_hello, x4_hello, x5_hello);
return 0;
}
Tại sao bạn nói, ý tưởng khủng khiếp là gì. Tại sao bạn lại muốn làm điều đó?
Tôi rất vui vì bạn đã hỏi!
Xem xét khối này gỉ:
{
let marker = 0;
let borrowed = borrow_with_block_lifetime(data, &marker);
unsafe {
perform_ffi_call(borrowed);
}
}
Bây giờ bạn có một giá trị vay với một cuộc đời một cách rõ ràng bị chặn (marker) mà không sử dụng một đời cơ cấu, nhưng chúng tôi có thể đảm bảo tồn tại cho toàn bộ phạm vi của cuộc gọi ffi; đồng thời chúng tôi không gặp lỗi mơ hồ khi một số *
bị hủy tham chiếu không an toàn bên trong một khối không an toàn và do đó trình biên dịch không phát hiện lỗi đó, mặc dù lỗi được thực hiện bên trong khối an toàn.
(xem thêm Why are all my pointers pointing to the same place with to_c_str() in rust?)
Việc sử dụng một macro có thể khai báo các biến tạm thời cho mục đích này sẽ giảm bớt đáng kể những rắc rối tôi đã chiến đấu với các trình biên dịch. Đó là lý do tại sao tôi muốn làm điều này.
concat_idents tôi có thể bị xóa, nó đã được tính năng gated [# 13295] (https://github.com/mozilla/rust/pull/13295) và [# 13294] (https://github.com/mozilla/rust/issues/13294) – Arjan
Chúng tôi thực sự cần tính năng này giống như ## in C. Tôi liên tục phải viết các macro nơi người dùng đưa cho tôi hai tên vì chuỗi concat rất hạn chế. –