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.
Including a file
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"));
Lazy initialization
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:
The far future
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);
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…