使用 for 循环从数组生成 '&'static str'

Using for loops to generate `&'static str` from an array

提问人:martinomburajr 提问时间:11/17/2023 最后编辑:Uwe Keimmartinomburajr 更新时间:11/17/2023 访问量:92

问:

我需要知道这在 Rust 中是否可行(如果不可行,为什么会这样)。我在一个名为 The trait 的 trait 中有一个函数,其中包含一个关联的常量 for 和 。combined_wordsParentSIZE: u32WORDS: [&'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");
}

评论

0赞 cdhowie 11/17/2023
由于不同的原因,这目前在 Rust 中甚至不起作用:你不能使用 Self::SIZE 作为 const trait 成员的大小
0赞 Aleksander Krauze 11/17/2023
但是,您可以使 Parent trait 通用于 const SIZE: usize
0赞 cafce25 11/17/2023
@AleksanderKrauze这在语义上是不同的,你可以为同一个结构体使用不同的 s 多次实现该特征,如果它有效,你就不能对 OPs 变体这样做。SIZE
0赞 Chayim Friedman 11/19/2023
你能每晚使用吗?
0赞 Chayim Friedman 11/19/2023
即使这是可能的,这也需要极端类型的元编程。你真的需要它吗?为什么你负担不起一点分配?String

答:

-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