2

尝试执行以下操作时遇到类型错误:

use kuchiki::parse_html;
use kuchiki::traits::*;

fn main() {
    let data = r#"<!DOCTYPE html>
                  <html>
                      <body>
                          test
                      </body>
                  </html>"#;
    let dom = parse_html()
        .from_utf8()
        .from_iter(data.as_bytes());
}

错误是:

error[E0271]: type mismatch resolving `<tendril::fmt::Bytes as tendril::fmt::SliceFormat>::Slice == u8`
  --> src/main.rs:13:10
   |
13 |         .from_iter(data.as_bytes());
   |          ^^^^^^^^^ expected slice, found u8
   |
   = note: expected type `[u8]`
              found type `u8`
   = note: required because of the requirements on the impl of `std::convert::Into<tendril::tendril::Tendril<tendril::fmt::Bytes>>` for `&u8`

data.as_bytes()返回对字节切片 ( &[u8]) 的引用,所以我对found u8来自哪里感到困惑。我该如何纠正这个错误?

有问题的方法的文档在这里

4

1 回答 1

2

使用read_from()代替from_iter(),像这样:

use kuchiki::parse_html;
use kuchiki::traits::*;

fn main() {
    let data = r#"<!DOCTYPE html>
                  <html>
                      <body>
                          test
                      </body>
                  </html>"#;
    let dom = parse_html()
        .from_utf8()
        .read_from(&mut data.as_bytes());
}

你得到了编译错误,因为from_iter()需要一个 item type 的迭代器Tendril。Tendril 是一种字符串,因此类型data需要类似于Vec<&[u8]>,但你有&[u8].

您也可以使用 使其工作from_iter(),但它不太清晰/高效:

use kuchiki::parse_html;
use kuchiki::traits::*;

fn main() {
    let data = r#"<!DOCTYPE html>
                  <html>
                      <body>
                          test
                      </body>
                  </html>"#;
    let dom = parse_html()
        .from_utf8()
        .from_iter(vec![data.as_bytes()]);
}
于 2019-07-12T23:00:43.657 回答