rust - posterolateral - evaluacion de cadenas musculares pdf
Cómo crear una cadena estática en tiempo de compilación (2)
Hay bastantes formas de hacerlo. Puede cargar una cadena pregenerada del archivo si lo desea:
const DATA: &''static str = include_str!("filename.txt");
¡O para hacerlo durante la compilación puede usar
concat!
:
const DATA: &''static str = concat!("abc", "abc");
Quiero crear una
&''static str
larga
&''static str
hecha de secuencias repetitivas de caracteres, por ejemplo,
abcabcabc...
¿Hay alguna forma en Rust de hacer esto a través de una expresión, por ejemplo, algo como
long_str = 1000 * "abc"
en Python, o tengo que generarlo en Python y copiarlo / pegarlo en el código Rust?
No puedes hacer tal cosa en Rust estable.
Su ejemplo de
1000 * "abc"
tampoco se ejecuta en "tiempo de compilación" en Python, hasta donde yo entiendo Python.
Incluyendo un archivo
Si
tiene
que ser estático, puede usar un
script de construcción de Cargo
.
Este es un poco de código Rust que puede hacer muchas cosas antes de que su código se compile realmente.
Específicamente, puede escribir un archivo fuente que tenga su cadena y luego usar
include_str!
para llevarlo a su caja:
build.rs
use std::{
env, error::Error, fs::File, io::{BufWriter, Write}, path::Path,
};
fn main() -> Result<(), Box<Error>> {
let out_dir = env::var("OUT_DIR")?;
let dest_path = Path::new(&out_dir).join("long_string.txt");
let mut f = BufWriter::new(File::create(&dest_path)?);
let long_string = "abc".repeat(100);
write!(f, "{}", long_string)?;
Ok(())
}
lib.rs
static LONG_STRING: &''static str = include_str!(concat!(env!("OUT_DIR"), "/long_string.txt"));
Inicialización perezosa
Podría crear un valor lazy_static que tendría su cadena que se crearía solo una vez. Esto se hace en tiempo de ejecución, pero solo una vez.
Ver también:
- ¿Cómo puedes hacer un singleton estático seguro en Rust?
- ¿Cómo creo un singleton global mutable?
El futuro lejano
En algún momento, RFC 911 se implementará completamente. Esto, más un puñado de RFC adicionales, cada uno con una nueva funcionalidad, le permitirá escribir algo como:
// Does not work yet!
static LONG_STR: String = "abc".repeat(1000);