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
。我只是在阅读您的帖子之前没有建立连接。