Fondamentalmente, ci sono due parti a questa domanda:È possibile dichiarare le variabili proceduralmente usando le macro di Rust?
Potete passare un identificatore sconosciuto a una macro in Rust?
È possibile combinare stringhe per generare nuovi nomi di variabili in una macro di Rust? !
Per esempio, qualcosa come:
macro_rules! expand(
($x:ident) => (
let mut x_$x = 0;
)
)
Calling espandere (hi) ovvia non riesce a causa hi è un identificatore sconosciuta; ma puoi farlo in qualche modo?
ie. L'equivalente in C di qualcosa di simile:
#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;
}
Perché dici, che idea terribile. Perché vorresti mai farlo?
Sono contento che tu abbia chiesto!
considerare questo blocco di ruggine:
{
let marker = 0;
let borrowed = borrow_with_block_lifetime(data, &marker);
unsafe {
perform_ffi_call(borrowed);
}
}
È ora hanno un valore preso in prestito con una durata di vita limitata in modo esplicito (marker) che non utilizza tutta la vita struttura, ma che possiamo garantire esiste per l'intero ambito di la chiamata ffi; allo stesso tempo non ci imbattiamo in errori oscuri in cui un *
viene de-referenziato in modo non sicuro all'interno di un blocco non sicuro e quindi il compilatore non lo rileva come un errore, nonostante l'errore venga effettuato all'interno di un blocco sicuro.
(vedi anche Why are all my pointers pointing to the same place with to_c_str() in rust?)
L'uso di una macro che può dichiarare variabili temporanee per questo scopo sarebbe notevolmente alleviare i problemi che ho in lotta con il compilatore. Ecco perché voglio farlo.
concat_idents potrebbe essere rimosso, era già dotato di funzionalità [# 13295] (https://github.com/mozilla/rust/pull/13295) e [# 13294] (https://github.com/mozilla/rust/issues/13294) – Arjan
Abbiamo davvero bisogno di questa funzione simile a ## in C. Devo costantemente scrivere macro in cui gli utenti mi danno due nomi perché string concat è così limitato. –