String 什么是“`str`在编译时没有已知的常量大小”;意思是什么';最简单的解决方法是什么?

String 什么是“`str`在编译时没有已知的常量大小”;意思是什么';最简单的解决方法是什么?,string,pointers,rust,String,Pointers,Rust,我试图操作从函数参数派生的字符串,然后返回该操作的结果: fn main() { let a: [u8; 3] = [0, 1, 2]; for i in a.iter() { println!("{}", choose("abc", *i)); } } fn choose(s: &str, pad: u8) -> String { let c = match pad { 0 => ["00000000000

我试图操作从函数参数派生的字符串,然后返回该操作的结果:

fn main() {
    let a: [u8; 3] = [0, 1, 2]; 
    for i in a.iter() {
        println!("{}", choose("abc", *i));
    }
}

fn choose(s: &str, pad: u8) -> String {
    let c = match pad {
        0 => ["000000000000000", s].join("")[s.len()..],
        1 => [s, "000000000000000"].join("")[..16],
        _ => ["00", s, "0000000000000"].join("")[..16],
    };
    c.to_string()
}
在构建时,我遇到以下错误:

error[E0277]:不满足特征绑定'str:std::marker::Sized'
-->src\main.rs:9:9
|
9 |设c=匹配垫{
|^`str`在编译时没有已知的常量大小
|
=help:trait`std::marker::Sized`未为`str实现`
=注意:所有局部变量必须具有静态已知的大小

这里有什么问题,最简单的解决方法是什么?

TL;DR不要使用
str
,使用
&str
。参考资料很重要


这个问题可以简化为:

fn main() {
    let demo = "demo"[..];
}
您正在尝试对
&str
进行切片(但是
字符串
&T]
Vec
等也会发生同样的情况),但没有引用结果。这意味着
演示
的类型将是
str
。要修复它,请添加

let demo = &"demo"[..];
在更广泛的示例中,您还遇到了这样一个事实:您正在
match
语句(通过
join
)的内部创建一个已分配的
字符串然后尝试返回对它的引用。这是不允许的,因为
字符串
将在
匹配
的末尾删除,从而使任何引用无效。在另一种语言中,这可能会导致内存不安全

一种可能的修复方法是在函数期间存储创建的
字符串
,在创建新字符串之前防止其释放:

fn choose(s: &str, pad: u8) -> String {
    let tmp;

    match pad {
        0 => {
            tmp = ["000000000000000", s].join("");
            &tmp[s.len()..]
        }
        1 => {
            tmp = [s, "000000000000000"].join("");
            &tmp[..16]
        }
        _ => {
            tmp = ["00", s, "0000000000000"].join("");
            &tmp[..16]
        }
    }.to_string()
}
编辑方面,可能有更有效的方法编写此函数。具有填充字符串的选项。您甚至可以截断从
join
返回的字符串而不创建新字符串



它的意思很难简明扼要地解释。锈菌有许多类型没有大小。最常见的是
str
[T]
。将这些类型与您通常使用的方式进行对比:
&str
&[T]
。您甚至可以将它们视为
。它们的共同点是它们总是在某种引用后面使用

因为这些类型没有大小,它们不能存储在堆栈上的变量中-编译器不知道为它们保留多少堆栈空间!这是错误消息的本质

另见:


比你更重要。特别要感谢指向字符串填充的指针,我将很快对其进行研究。像Rust或Python这样的语言,它可爱、庞大,几乎内置于库中,是一把略带双刃剑。还有很多东西要学……“它的意思更难简洁地解释。”然后再简明扼要地解释。@AndreKR谢谢(我想)!不过,答案的这一部分相当薄弱,因为它并没有真正解释什么东西可以“不定尺寸”或者为什么这样一个概念是有用的,更不用说掩饰堆栈是什么了。我认为大多数语言都将它们的局部变量存储在堆栈上,所以这是一个熟悉的概念。为什么它没有大小是在错误消息中-它没有实现
size
。我只是在阅读您的帖子之前没有建立连接。