我正在尝试理解Rust的多态性。从我的面向对象编程(OOP)背景来看,我期望以下Rust代码可以运行:
use std::io::{stdin, Read};
fn main() {
let r: Read = stdin();
println!("ok");
}
但实际上它并不会:
4 | let r: Read = stdin();
| ^^^^^^^ expected trait std::io::Read, found struct `std::io::Stdin`
我知道有一个适用于
StdIn
的 Read
实现,那么我该如何使其正常工作呢?换句话说,如何在需要使用 Read
的地方使用 Stdin
、File
或者如果可能的话是 String
(找不到它的实现)?我认为我不能在这里使用泛型,因为我需要将实现了
Read
的 r
实例传递给后面的另一个方法,但如果我错了,请告诉我。
Read::read
方法,也许这样会更高效(并且对于字符串情况也适用)? - RenatoRead :: read
实现的指针,以及一个指向该具体类型特定数据的指针。这将是两个指针,Rust将它们粘合在一起并调用fat pointer,而a trait object is that。在链接的重复项中,有一个使用trait object reference(&Read
)的示例,这就是你所要求的。Box<Read>
是一个boxed trait object。 - ShepmasterString
问题:请使用Cursor<String>
,它实现了Read
。 - Lukas Kalbertodt&MyStruct
(指向数据的指针)和&MyTrait
(带有vtable的指向数据的指针)之间的区别。Rust只是让你更明确地处理额外的间接性。 - trent