我想创建一个由重复的字符序列组成的长 &'static str ,例如 abcabcabc...
&'static str
abcabcabc...
Rust中有没有办法通过表达式来实现这一点,例如:类似于Python中的 long_str = 1000 * "abc" ,或者我是否必须在Python中生成它并将其复制/粘贴到Rust代码中?
long_str = 1000 * "abc"
你不能在稳定的Rust中做这样的事情 . 在我理解Python的过程中,您的 1000 * "abc" 示例也不在Python的"compile time"上运行 .
1000 * "abc"
如果它必须是静态的,你可以使用Cargo build script . 这是一些Rust代码,可以在实际编译代码之前做很多事情 . 具体来说,您可以编写一个包含您的字符串的源文件,然后使用include_str!将其放入您的包中:
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_static值,使您的字符串只创建一次 . 这是在运行时完成的,但只需一次 .
也可以看看:
How can you make a safe static singleton in Rust?
How do I create a global, mutable singleton?
在某些时候,RFC 911将完全实施 . 此外,还有一些额外的RFC,每个都添加了新的功能,这将使您能够编写如下内容:
// Does not work yet! static LONG_STR: String = "abc".repeat(1000);
有很多方法可以做到这一点 . 如果您愿意,可以从文件加载预先生成的字符串:
const DATA: &'static str = include_str!("filename.txt");
或者在编译期间执行此操作,您可以使用 concat! :
concat!
const DATA: &'static str = concat!("abc", "abc");
2 回答
你不能在稳定的Rust中做这样的事情 . 在我理解Python的过程中,您的
1000 * "abc"
示例也不在Python的"compile time"上运行 .包含文件
如果它必须是静态的,你可以使用Cargo build script . 这是一些Rust代码,可以在实际编译代码之前做很多事情 . 具体来说,您可以编写一个包含您的字符串的源文件,然后使用include_str!将其放入您的包中:
build.rs
lib.rs
延迟初始化
您可以创建一个lazy_static值,使您的字符串只创建一次 . 这是在运行时完成的,但只需一次 .
也可以看看:
How can you make a safe static singleton in Rust?
How do I create a global, mutable singleton?
遥远的未来
在某些时候,RFC 911将完全实施 . 此外,还有一些额外的RFC,每个都添加了新的功能,这将使您能够编写如下内容:
有很多方法可以做到这一点 . 如果您愿意,可以从文件加载预先生成的字符串:
或者在编译期间执行此操作,您可以使用
concat!
: