提问人:martinomburajr 提问时间:11/17/2023 最后编辑:Uwe Keimmartinomburajr 更新时间:11/17/2023 访问量:92
使用 for 循环从数组生成 '&'static str'
Using for loops to generate `&'static str` from an array
问:
我需要知道这在 Rust 中是否可行(如果不可行,为什么会这样)。我在一个名为 The trait 的 trait 中有一个函数,其中包含一个关联的常量 for 和 。combined_words
Parent
SIZE: u32
WORDS: [&'static str; SIZE]
我希望该函数在编译时使用两个已知大小的关联常量来生成 &'static str。
我不确定这是否可行,如果是这样,我是否缺少什么,是否需要使用宏。有没有一个图书馆可以做到这一点。
trait Parent {
const SIZE: usize;
const WORDS: [&'static str; <X as Parent>::SIZE];
// this is the function I want to implement. It's just pseudocode for now
fn combined_words() -> &'static str {
for i in 0..X::SIZE {
// concat the words into a single &'static str e.g.
format!("{}{}", X::WORDS[i as usize], i);
}
// and return it
}
}
struct X;
impl Parent for X {
const SIZE: usize = 3;
const WORDS: [&'static str; <X as Parent>::SIZE] = ["hi", "there", "friend"];
}
fn main() {
let x: X = X{};
assert_eq!(X::combined_words(), "hi1there2friend3");
}
答:
-1赞
FZs
11/17/2023
#1
不,不能有。
str
是一个字符串切片,即位于连续内存中的字符串。
使用(或其他类似的东西)必须操作字符串,因此它不能返回引用(内存中没有串联的字符串已经连续存在的地方)。format
您可以做的最接近的事情是尝试相反的方法,即将字符串与单词边界的索引一起存储在一起。然后,您可以创建一个获取第 n个单词的函数,就像索引数组一样;获取整个字符串是微不足道的:
let string = "Lorem ipsum dolor sit amet";
let indices = [0, 6, 12, 18, 22];
fn get_word<'a>(s: &'a str, indices: &[usize], index: usize) -> &'a str {
&s[
indices[index] .. indices.get(index+1).copied().unwrap_or(s.len())
]
}
get_word(string, &indices, 3) // &'static "sit "
string // &'static "Lorem ipsum dolor sit amet"
或者,你可以用简单的方法使用 s。String
评论
Self::SIZE
作为const
trait 成员的大小。Parent
trait 通用于const SIZE: usize
。SIZE
String