从new返回通用结构

时间:2017-12-11 18:29:47

标签: generics rust

我想返回一个通用结构。我的想法是,我希望按照标准将实际的实现输出输出到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>声明不同的(但同名!)RW

有没有办法做到这一点,不需要我做两个不同的new函数,一个用于内存读/写,另一个用于STDIN读/写?

1 个答案:

答案 0 :(得分:3)

我认为您可能误解了用于初始化结构的语法 - 实际上,您的功能是尝试将结构的readerwriter字段设置为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',如果您还没有 - 它涵盖了所有这些内容。