首页 文章

如何在编译时创建静态字符串

提问于
浏览
20

我想创建一个由重复的字符序列组成的长 &'static str ,例如 abcabcabc...

Rust中有没有办法通过表达式来实现这一点,例如:类似于Python中的 long_str = 1000 * "abc" ,或者我是否必须在Python中生成它并将其复制/粘贴到Rust代码中?

2 回答

  • 11

    你不能在稳定的Rust中做这样的事情 . 在我理解Python的过程中,您的 1000 * "abc" 示例也不在Python的"compile time"上运行 .

    包含文件

    如果它必须是静态的,你可以使用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值,使您的字符串只创建一次 . 这是在运行时完成的,但只需一次 .

    也可以看看:

    遥远的未来

    在某些时候,RFC 911将完全实施 . 此外,还有一些额外的RFC,每个都添加了新的功能,这将使您能够编写如下内容:

    // Does not work yet!
    static LONG_STR: String = "abc".repeat(1000);
    
  • 9

    有很多方法可以做到这一点 . 如果您愿意,可以从文件加载预先生成的字符串:

    const DATA: &'static str = include_str!("filename.txt");
    

    或者在编译期间执行此操作,您可以使用 concat!

    const DATA: &'static str = concat!("abc", "abc");
    

相关问题