gpt4 book ai didi

rust - 为什么不能将 &str 传递给接受 &dyn Display 特征对象的函数?

转载 作者:行者123 更新时间:2023-11-29 08:07:04 26 4
gpt4 key购买 nike

我正在读一本 Rust 书,我对这个例子感到困惑:

use std::fmt::Display;

fn main() {
test("hello");
test2("hello")
}

fn test(s: &dyn Display) {
println!("{}", s);
}

fn test2(s: &str) {
println!("{}", s);
}

&'static str 作为特征对象传递失败:

error[E0277]: the size for values of type `str` cannot be known at compilation time
--> src/main.rs:4:10
|
4 | test("hello");
| ^^^^^^^ doesn't have a size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `str`
= note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
= note: required for the cast to the object type `dyn std::fmt::Display`

为什么这会失败而第二次调用会成功?

最佳答案

str 确实实现了 Display,但是不可能将 &str 强制转换为 &dyn Display,因为strDisplay 的实现可能(并且确实)使用字符串的长度。 Length 是 &str 类型的一部分,但不是 &dyn Display 类型的一部分,您不能丢弃长度,因为那样将无法实现 Display 完全没有。

另一种看待这个问题的方法是,对于 strDisplay 的实现不存在 vtable(虚方法表),因为 vtables 可能只包含函数接受瘦 self 指针,但在 impl Display for str 中,&self 是胖指针。另见 Why can't `&(?Sized + Trait)` be cast to `&dyn Trait`?

但是,&str 本身也实现了Display,因此您可以通过简单地添加另一个间接层来使test 工作:

fn main() {
test(&"hello");
}

关于rust - 为什么不能将 &str 传递给接受 &dyn Display 特征对象的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57817405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com