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

Rust 如何在编译时创建静态字符串,rust,Rust,我想创建一个由重复的字符序列组成的长的&'static str,例如abcabc… Rust中有没有一种方法可以通过表达式来实现这一点,例如Python中的long_str=1000*“abc”,或者我必须在Python中生成它并将其复制/粘贴到Rust代码中?在稳定的Rust中无法实现这一点。就我对Python的理解而言,您的1000*“abc”示例也不是在Python的“编译时”运行的 包括一个文件 如果必须是静态的,可以使用。这是一个有点生锈的代码,可以在您的代码实际编译之前做很多事情。具

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


Rust中有没有一种方法可以通过表达式来实现这一点,例如Python中的
long_str=1000*“abc”
,或者我必须在Python中生成它并将其复制/粘贴到Rust代码中?

在稳定的Rust中无法实现这一点。就我对Python的理解而言,您的
1000*“abc”
示例也不是在Python的“编译时”运行的

包括一个文件 如果必须是静态的,可以使用。这是一个有点生锈的代码,可以在您的代码实际编译之前做很多事情。具体来说,您可以写出一个包含字符串的源文件,然后使用它将其放入板条箱:

build.rs

使用std::{
env,error::error,fs::File,io::{BufWriter,Write},path::path,
};
fn main()->结果{
放出来的目录=env::var(“放出来的目录”)?;
让dest_path=path::new(&out_dir).join(“long_string.txt”);
让mut f=BufWriter::new(文件::创建(&dest_路径)?);
让long_string=“abc”。重复(100);
写!(f,“{}”,长字符串)?;
好(())
}
lib.rs

静态长字符串:&'static str=include\u str!(concat!(env!(“OUT_DIR”),“/long_string.txt”);
延迟初始化 您可以创建一个或值,在运行时创建字符串,但只能创建一次

use once_cell::sync::Lazy;//1.5.2
静态LONG_STR:Lazy=Lazy::new(| |“abc”。重复(5000));
另见:

遥远的未来 在某个时候,这些措施将得到充分实施。这一点,再加上几个额外的RFC,每个RFC都添加了新的功能,将允许您编写如下内容:

//还不起作用!
静态长字符串:String=“abc”。重复(1000);

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

const DATA: &'static str = include_str!("filename.txt");
或者在编译过程中使用
concat

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

我不为这个答案感到骄傲:D,但我想给出一个不同的观点

通过使用宏规则,您可以轻松地按组合定义静态连接。在本例中,我定义了100*str=4*25*str=4*5*5*str。您也可以用更少的行(但更多的列:)来执行100*str=10*10*str

macro\u规则!代表{
($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(){
断言(rep!(“x”,100).len(),100);
}
由于宏作用于语言元素,因此不可能使用计数器和简单的递归调用宏,如下所示:

macro\u规则!你不工作吗{
($t:expr,1)=>{$t};
($t:expr,$n:)=>{concat!($t,不工作!($t,$n-1))};
}

但是在这个简单的例子中,递归地编写宏应该可以做到这一点。我没有尝试使用不同的宏规则模式或其他类型的宏,但应该可以做一些更优雅的事情。

请展示一个
concat的示例等于
1000*“abc”
^_^我正在尝试创建一个使用
concat的“字符串乘法”宏现在持续20分钟。。。可悲的是,我心烦意乱,还没有成功:<。。。(然而!)这是我的尝试:我用任何语言编写的第一个宏,所以不知道它是否好。@JohanLarsson问题是,OP需要一个在编译时创建的静态字符串。您的宏可以工作,但在运行时执行所有操作,并返回一个
字符串
…好的,感谢您的审阅,这只是一个偶然的机会。现在,您可以编写
“abc”。重复(100)
,使用重复的数据生成一个
字符串
。比iter::repeat()版本清洁一点