传递闭包时,特性绑定`std :: io :: Write +'static:std :: marker :: Sized`不满足

时间:2016-05-16 10:00:49

标签: rust traits higher-order-functions

我正试图摆脱程序中的一些代码重复,我决定使用一个函数,它将采用Fn() -> Result<io::Write>类型的闭包,当我要求它时,它将为我提供输出流。

所以这是这个功能:

fn dowload_body<F>(/* some params ommited */ write_supplier: F) -> Result<()>
  where F: Fn() -> Result<Write> {
  if ... {
    let mut destination = try!(write_supplier());
    // use this stream
  }
}

我想用它来举例如:

let destination_path = Path::new("some path");
let result = Self::dowload_body(|| try_str!(OpenOptions::new().append(true).open(destination_path)));

我收到以下错误:

src/http.rs:105:3: 121:4 error: the trait bound `std::io::Write + 'static: std::marker::Sized` is not satisfied [E0277]
src/http.rs:105   fn dowload_body<F>(write_supplier: F) -> Result<()>
                  ^

我是生锈的新手,没有找到解决方案的运气。

1 个答案:

答案 0 :(得分:4)

您无法在结果中直接放置未归一化的变量(特征)。也许你的意思是这个?

fn dowload_body<F, W: Write>(write_supplier: F) -> Result<()>
//                 ^
  where F: Fn() -> Result<W> 
//                        ^ create a template for the trait.
{