我想返回一个通用结构。我的想法是,我希望按照标准将实际的实现输出输出到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读/写?
答案 0 :(得分:3)
我认为您可能误解了用于初始化结构的语法 - 实际上,您的功能是尝试将结构的reader
和writer
字段设置为R
和{ {1}},而不是您传入的参数!
它应该是这样的:
W
因为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: reader, // field name on the left, value on the right
writer: writer,
}
}
}
我建议您阅读Chapter 5 of 'The Rust Programming Language',如果您还没有 - 它涵盖了所有这些内容。