I want to create a long &'static str
made of repeating sequences of chars, e.g. abcabcabc...
Is there a way in Rust to do this via an expression, e.g. something like long_str = 1000 * "abc"
in Python, or do I have to generate it in Python and copy/paste it in the Rust code?
You cannot do such a thing in stable Rust. Your example of 1000 * "abc"
is not run at "compile time" in Python either, as far as I understand Python.
If it has to be static, you could use a Cargo build script. This is a bit of Rust code that can do lots of things before your code is actually compiled. Specifically, you could write a source file out that has your string and then use include_str!
to bring it into your crate:
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"));
You could create a once_cell or lazy_static value that would create your string at runtime, but only once.
use once_cell::sync::Lazy; // 1.5.2
static LONG_STR: Lazy<String> = Lazy::new(|| "abc".repeat(5000));
See also:
At some point, RFC 911 will be fully implemented. This, plus a handful of additional RFCs, each adding new functionality, will allow you to be able to write something like:
// Does not work yet!
static LONG_STR: String = "abc".repeat(1000);
There are quite a few ways to do that. You could load a pre-generated string from file if you like:
const DATA: &'static str = include_str!("filename.txt");
Or to do it during compilation you can use concat!
:
const DATA: &'static str = concat!("abc", "abc");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With