我想返回一个通用结构。我的想法是我想按照标准将实际的实现输出输出到STDIN,但是出于测试目的,我想用向量或其他东西替代它,以便我可以轻松地测试输出。我到目前为止的解决方案是:
#[derive(Debug)]
pub struct Sender<R, W> {
pub reader: R,
pub writer: W,
}
#[derive(Debug)]
pub struct Sender<R, W> {
pub reader: R,
pub writer: W,
}
impl<R, W> Sender<R, W> {
pub fn new<R, W>(reader: R, writer: W) -> Sender<R, W> {
Sender {
reader: R,
writer: W,
}
}
}
我得到的错误:
error[E0423]: expected value, found type parameter `R`
--> src/main.rs:10:21
|
10 | reader: R,
| ^ not a value
error[E0423]: expected value, found type parameter `W`
--> src/main.rs:11:21
|
11 | writer: W,
| ^ not a value
error[E0601]: main function not found
error[E0194]: type parameter `R` shadows another type parameter of the same name
--> src/main.rs:8:16
|
7 | impl<R, W> Sender<R, W> {
| - first `R` declared here
8 | pub fn new<R, W>(reader: R, writer: W) -> Sender<R, W> {
| ^ shadows another type parameter
error[E0194]: type parameter `W` shadows another type parameter of the same name
--> src/main.rs:8:19
|
7 | impl<R, W> Sender<R, W> {
| - first `W` declared here
8 | pub fn new<R, W>(reader: R, writer: W) -> Sender<R, W> {
| ^ shadows another type parameter
这对我来说很有意义,它不知道
R
的具体类型。我想通过在函数中提供通用参数可以解决此问题,但这会带来以下附加错误:34 | impl<R, W> Sender<R, W> {
| - first `R` declared here
35 | pub fn new<R, W>(reader: R, writer: W) -> Sender<R, W> {
| ^ shadows another type parameter
那是行不通的,因为
new<R, W>
声明了不同的R
和W
(但名称相同!)。有没有一种方法不需要我做两个不同的
new
函数,一个用于内存读/写,另一个用于STDIN读/写? 最佳答案
我认为您可能会误解用于初始化结构的语法-就目前而言,您的函数正在尝试将结构的reader
和writer
字段设置为R
和W
,而不是您要传入的参数!
它看起来应该像这样:
impl<R, W> Sender<R, W> {
pub fn new(reader: R, writer: W) -> Sender<R, W> {
Sender {
reader: reader, // field name on the left, value on the right
writer: writer,
}
}
}
因为struct字段和您的参数具有相同的名称,所以you can also use the field init shorthand syntax:
impl<R, W> Sender<R, W> {
pub fn new(reader: R, writer: W) -> Sender<R, W> {
Sender { reader, writer }
}
}
如果您还没有阅读Chapter 5 of 'The Rust Programming Language',我建议您阅读-它涵盖了所有这些内容。
关于generics - 从new返回泛型结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47759124/