为什么 Vec<&str> 在这里缺少生命周期说明符?
Why is Vec<&str> missing lifetime specifier here?
此代码编译:
struct IntDisplayable(Vec<u8>);
impl fmt::Display for IntDisplayable {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for v in &self.0 {
write!(f, "\n{}", v)?;
}
Ok(())
}
}
fn main() {
let vec: Vec<u8> = vec![1,2,3,4,5];
let vec_Foo = IntDisplayable(vec);
println!("{}",vec_Foo);
}
虽然这段代码没有:
struct StrDisplayable(Vec<&str>);
impl fmt::Display for StrDisplayable {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for v in &self.0 {
write!(f, "\n{}", v)?;
}
Ok(())
}
}
fn main() {
let vec: Vec<&str> = vec!["a","bc","def"];
let vec_Foo = StrDisplayable(vec);
println!("{}",vec_Foo);
}
错误信息:
error[E0106]: missing lifetime specifier
--> src/lib.rs:3:27
|
3 | struct StrDisplayable(Vec<&str>);
| ^ expected lifetime parameter
我想做的是为 Vec<&str>
实现 fmt::Display
,这通常需要像 一样包装 Vec
,但它只适用于 Vec<u8>
,为什么把Vec<u8>
代入Vec<&str>
会导致这样的编译错误?
编译器被告知您正在借用一个值,但不知道它的有效期。它应该是静态的吗?还有别的吗?
我推测您正在尝试执行以下操作。
struct StrDisplayable<'a>(Vec<&'a str>);
通过这种方式,您可以明确告诉编译器字符串至少与结构一样长,不会更短。
您还需要在特征的实现中添加生命周期,如果使用 Rust 2018 则可以匿名。
此代码编译:
struct IntDisplayable(Vec<u8>);
impl fmt::Display for IntDisplayable {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for v in &self.0 {
write!(f, "\n{}", v)?;
}
Ok(())
}
}
fn main() {
let vec: Vec<u8> = vec![1,2,3,4,5];
let vec_Foo = IntDisplayable(vec);
println!("{}",vec_Foo);
}
虽然这段代码没有:
struct StrDisplayable(Vec<&str>);
impl fmt::Display for StrDisplayable {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for v in &self.0 {
write!(f, "\n{}", v)?;
}
Ok(())
}
}
fn main() {
let vec: Vec<&str> = vec!["a","bc","def"];
let vec_Foo = StrDisplayable(vec);
println!("{}",vec_Foo);
}
错误信息:
error[E0106]: missing lifetime specifier
--> src/lib.rs:3:27
|
3 | struct StrDisplayable(Vec<&str>);
| ^ expected lifetime parameter
我想做的是为 Vec<&str>
实现 fmt::Display
,这通常需要像 Vec
,但它只适用于 Vec<u8>
,为什么把Vec<u8>
代入Vec<&str>
会导致这样的编译错误?
编译器被告知您正在借用一个值,但不知道它的有效期。它应该是静态的吗?还有别的吗?
我推测您正在尝试执行以下操作。
struct StrDisplayable<'a>(Vec<&'a str>);
通过这种方式,您可以明确告诉编译器字符串至少与结构一样长,不会更短。
您还需要在特征的实现中添加生命周期,如果使用 Rust 2018 则可以匿名。