我想返回一个通用结构。我的想法是我想按照标准将实际的实现输出输出到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读/写?

最佳答案

我认为您可能会误解用于初始化结构的语法-就目前而言,您的函数正在尝试将结构的readerwriter字段设置为RW,而不是您要传入的参数!

它看起来应该像这样:

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/

10-12 00:33
查看更多