生锈 – “大小不实现”是什么意思?

我在Rust写了以下代码:

use std::io::{IoResult, Writer};
use std::io::stdio;

fn main() {
    let h = |&: w: &mut Writer| -> IoResult<()> {
        writeln!(w, "foo")
    };
    let _ = h.handle(&mut stdio::stdout());
}

trait Handler<W> where W: Writer {
    fn handle(&self, &mut W) -> IoResult<()>;
}

impl<W, F> Handler<W> for F
where W: Writer, F: Fn(&mut W) -> IoResult<()> {
    fn handle(&self, w: &mut W) -> IoResult<()> { (*self)(w) }
}

然后在我的终端生锈:

$ rustc writer_handler.rs
writer_handler.rs:8:15: 8:43 error: the trait `core::marker::Sized` is not implemented for the type `std::io::Writer`
writer_handler.rs:8     let _ = h.handle(&mut stdio::stdout());
                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
writer_handler.rs:8:15: 8:43 error: the trait `core::marker::Sized` is not implemented for the type `std::io::Writer`
writer_handler.rs:8     let _ = h.handle(&mut stdio::stdout());
                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 2 previous errors

为什么这个Writer需要实现Sized。在我看来,Sized是不需要的。

我应该做什么,同时保持特务Handler有这个通用的参数。

Sized特征是非常特别的,特别的是在大多数情况下它是类型参数的默认约束。它表示在编译时已知的固定大小的值,如u8(1字节)或& u32(具有64位指针的平台上的8个字节)等。这些值是灵活的:它们可以放置在堆栈上移动到堆上,并且通常传递一个副作用,因为编译器知道它需要多少空间,而这个值是多少。

不大小的类型受到更多限制,Writer类型的值不大:它代表抽象地代表实现Writer的一些未指定类型,不知道实际类型是什么。由于实际的类型是未知的,所以大小是不可知的:一些大类型是Writers,一些小类型是。作者是一个特征对象的例子,目前它只能出现在一个指针后面的执行代码中。 & mut Writer。

这就解释了为什么Sized是默认的:它通常是想要的。

在任何情况下,对于你的代码,这是弹出,因为你使用句柄与h,这是一个Fn(& mut Writer) – > IoResult≤()取代。如果我们与F:Fn(& mut W) – > IoResult≤()>类型Handle被实现,我们发现W = Writer,也就是说,我们试图用特征对象& mut Writer来使用句柄,而不是一些具体的类型W的& mut W。这是非法的,因为W trait和impl中的参数默认有一个Sized bound,如果我们手动覆盖它与Size然后一切正常:

use std::io::{IoResult, Writer};
use std::io::stdio;

fn main() {
    let h = |&: w: &mut Writer| -> IoResult<()> {
        writeln!(w, "foo")
    };
    let _ = h.handle(&mut stdio::stdout());
}

trait Handler<W: ?Sized> where W: Writer {
    fn handle(&self, &mut W) -> IoResult<()>;
}

impl<W: ?Sized, F> Handler<W> for F
where W: Writer, F: Fn(&mut W) -> IoResult<()> {
    fn handle(&self, w: &mut W) -> IoResult<()> { (*self)(w) }
}

(我写了一个thing about sized —和特征的对象,一般来说,链接在第一段—几天前,这有一点更多的细节。)

http://stackoverflow.com/questions/28044231/what-does-sized-is-not-implemented-mean

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:生锈 – “大小不实现”是什么意思?