Подтвердить что ты не робот

Как создать статическую строку во время компиляции

Я хочу создать длинный &'static str из повторяющихся последовательностей символов, например. abcabcabc...

Есть ли способ в Rust сделать это с помощью выражения, например. что-то вроде long_str = 1000 * "abc" в Python, или мне нужно сгенерировать его на Python и скопировать/вставить его в код Rust?

4b9b3361

Ответ 1

В настоящее время вы не можете этого сделать. Ваш пример 1000 * "abc" также не запускается в "время компиляции" на Python, насколько я понимаю Python.

Включение файла

Если он должен быть статичным, вы можете использовать Cargo build script. Это немного кода Rust, который может сделать много вещей, прежде чем ваш код будет скомпилирован. В частности, вы можете написать исходный файл, в котором есть ваша строка, а затем используйте include_str! в свой ящик:

build.rs

use std::{iter, env};
use std::path::Path;
use std::io::{Write, BufWriter};
use std::fs::File;

fn main() {
    let out_dir = env::var("OUT_DIR").unwrap();
    let dest_path = Path::new(&out_dir).join("long_string.txt");
    let mut f = BufWriter::new(File::create(&dest_path).unwrap());

    let long_string = "abc".repeat(100);
    write!(f, "{}", long_string).unwrap();
}

lib.rs

static LONG_STRING: &'static str = include_str!("long_string.txt");

Ленивая инициализация

Возможно, вы также можете создать lazy_static, в результате чего ваша строка будет создана один раз. Это делается во время выполнения, но только один раз.

Ответ 2

Существует несколько способов сделать это. Вы можете загрузить предварительно созданную строку из файла, если хотите:

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

Или для этого во время компиляции вы можете использовать concat!:

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