第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

什么“大小沒有實(shí)現(xiàn)”是什么意思?

什么“大小沒有實(shí)現(xiàn)”是什么意思?

什么“大小沒有實(shí)現(xiàn)”是什么意思?我寫了以下代碼: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 Fwhere W: Writer, F: Fn(&mut W) -> IoResult<()> {    fn handle(&self, w: &mut W) -> IoResult<()> { (*self)(w) }}然后rustc在我的終端:$ rustc writer_handler.rswriter_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());                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~為什么Writer需要實(shí)施Sized?在我看來,Sized不需要。在保持trait Handler這種通用論證的同時(shí)我應(yīng)該做些什么?在Rust 1.0中,這個(gè)類似的代碼會(huì)產(chǎn)生同樣的問題:use std::io::{self, Write};fn main() {    handle(&mut io::stdout());}fn handle(w: &mut Write) -> io::Result<()> {    handler(w)}fn handler<W>(w: &mut W) -> io::Result<()>where    W: Write,{    writeln!(w, "foo")}有錯(cuò)誤:error[E0277]: the trait bound `std::io::Write: std::marker::Sized` is not satisfied --> src/main.rs:8:5  |8 |     handler(w)  |     ^^^^^^^ `std::io::Write` does not have a constant size known at compile-time  |  = help: the trait `std::marker::Sized` is not implemented for `std::io::Write`  = note: required by `handler`
查看完整描述

2 回答

?
烙印99

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個(gè)贊

Sized特點(diǎn)是比較特殊的,如此特別,在大多數(shù)情況下,勢(shì)必對(duì)類型參數(shù)的默認(rèn)值。它表示在編譯時(shí)已知固定大小的值,如u8(1個(gè)字節(jié))或&u32(64位指針平臺(tái)上的8個(gè)字節(jié))等。這些值很靈活:它們可以放在堆棧上并移到堆上并且通常按值傳遞,因?yàn)榫幾g器知道它需要多少空間。

未調(diào)整大小的類型受到更多限制,并且類型的值Writer未調(diào)整大?。核橄蟮乇硎緦?shí)現(xiàn)的某些未指定類型,Writer而不知道實(shí)際類型是什么。由于實(shí)際類型未知,因此無法知道大小:某些大型是Writers,有些是小型。Writer是特征對(duì)象的一個(gè)示例,此時(shí),它只能出現(xiàn)在指針后面的已執(zhí)行代碼中。常見的例子包括&Writer&mut WriterBox<Writer>。

這解釋了為什么Sized是默認(rèn)值:它通常是人們想要的。

在任何情況下,對(duì)于你的代碼,這是因?yàn)槟阏谑褂?code>handle而出現(xiàn)h,這是一個(gè)Fn(&mut Writer) -> IoResult<()>。如果我們將這與我們發(fā)現(xiàn)的F: Fn(&mut W) -> IoResult<()>類型相匹配,那就是我們嘗試使用trait對(duì)象,而不是某種具體類型。這是非法的,因?yàn)閠rait和impl中的參數(shù)都默認(rèn)為有一個(gè)綁定,如果我們手動(dòng)覆蓋它然后一切正常:HandleW = Writerhandle&mut Writer&mut WWWSized?Sized

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) }}

而對(duì)于Rust 1.0代碼:

use std::io::{self, Write};fn main() {
    handle(&mut io::stdout());}fn handle(w: &mut Write) -> io::Result<()> {
    handler(w)}fn handler<W: ?Sized>(w: &mut W) -> io::Result<()>where
    W: Write,{
    writeln!(w, "foo")}

我還寫了一篇關(guān)于Sized和特征對(duì)象的博客文章,其中有一些細(xì)節(jié)。


查看完整回答
反對(duì) 回復(fù) 2019-08-13
?
慕工程0101907

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個(gè)贊

首先,請(qǐng)注意這h是一種實(shí)現(xiàn)的類型Fn(&mut Writer) -> IoResult<()>。

h.handle正被召喚; 這個(gè)要看的話,在Handler這里實(shí)施WWriter-注意的是仔細(xì):W  Writer,一個(gè)無膠式。該&mut stdio::stdout()因此將被強(qiáng)制轉(zhuǎn)換為&mut Writer特征的對(duì)象。這在理論上非常好,但是當(dāng)被帶回實(shí)施時(shí)就會(huì)倒塌。當(dāng)涉及到約束時(shí),默認(rèn)情況下它們是大小的,因此它會(huì)抱怨,Writer您嘗試分配的值W不是大小。

這里有兩個(gè)主要解決方案:

  1. 切換到使用具體的編寫器類型,h以便您處理大小的類型:

    use std::io::{IoResult, Writer, stdio, LineBufferedWriter};use std::io::stdio::StdWriter;fn main() {
        let h = |&: w: &mut LineBufferedWriter<StdWriter>| -> 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) }}
  2. 允許W成為未定義的類型。這是可以接受的,因?yàn)槟荒芡ㄟ^引用使用它&mut W。如果您希望將其用作裸型,例如W按價(jià)值計(jì)算的方法,則不會(huì)這樣做。

    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) }}

我會(huì)建議支持一個(gè)unsized,W即使你沒有在這種情況下使用它 - 沒有理由它需要大小。


查看完整回答
反對(duì) 回復(fù) 2019-08-13
  • 2 回答
  • 0 關(guān)注
  • 508 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)