我想创建一个由重复的字符序列组成的长&'static str
,例如abcabcabc...
Rust中是否有办法通过表达式执行此操作,例如类似于Python中的long_str = 1000 * "abc"
,或者我是否必须在Python中生成它并将其复制/粘贴到Rust代码中?
答案 0 :(得分:12)
你不能在稳定的Rust中做这样的事情。您的<div ng-repeat="stockSearch in stocksSearchList">
示例不会在&#34;编译时运行&#34;在Python中也是如此,据我所知,Python。
如果 是静态的,您可以使用Cargo build script。这是一些Rust代码,可以在实际编译代码之前做很多事情。具体来说,您可以编写一个包含字符串的源文件,然后使用include_str!
将其放入您的包中:
<强> build.rs 强>
1000 * "abc"
<强> lib.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(())
}
您可以创建一个lazy_static值,使您的字符串只创建一次。这是在运行时完成的,但只需一次。
另见:
在某些时候,RFC 911将完全实施。此外,还有一些额外的RFC,每个都添加了新功能,可以让您编写如下内容:
static LONG_STRING: &'static str = include_str!(concat!(env!("OUT_DIR"), "/long_string.txt"));
答案 1 :(得分:10)
有很多方法可以做到这一点。 如果您愿意,可以从文件加载预先生成的字符串:
const DATA: &'static str = include_str!("filename.txt");
或者在编译期间可以使用concat!
:
const DATA: &'static str = concat!("abc", "abc");
答案 2 :(得分:0)
这个答案不是很骄傲:D,但我想换一个角度。
通过使用宏规则,您可以轻松按组成定义静态串联。在这种情况下,我定义100 * str = 4 * 25 * str = 4 * 5 * 5 * str。您还可以用更少的行(但是增加更多的列:))来执行100 * str = 10 * 10 * str
macro_rules! rep {
($t:expr, 4) => { concat!($t, $t, $t, $t) };
($t:expr, 5) => { concat!($t, $t, $t, $t, $t) };
($t:expr, 25) => { rep!(rep!($t, 5), 5) };
($t:expr, 100) => { rep!(rep!($t, 25), 4) };
}
fn main() {
assert_eq!(rep!("x", 100).len(), 100);
}
由于宏适用于语言元素,因此无法使用计数器,并且像这样简单地递归调用宏:
macro_rules! does_not_work {
($t:expr, 1) => { $t };
($t:expr, $n:) => { concat!($t, does_not_work!($t, $n-1)) };
}
但是在这种简单情况下,递归组成宏应该可以解决问题。我没有尝试使用不同的macro_rules模式或其他种类的宏,但应该可以做一些更优雅的事情。