rust - 可从方法访问但不能从外部访问的结构属性

标签 rust

我正在尝试用 Rust 构建一个基本的网络爬虫,我正在尝试将其移植到 html5ever .截至目前,我有一个内部结构应该返回 Vec<String> 的函数。 .它得到这个 Vec来自 return 语句中的结构。为什么它总是返回一个空向量? (跟生命周期参数有关系吗?)

fn find_urls_in_html<'a>(
    original_url: &Url,
    raw_html: String,
    fetched_cache: &Vec<String>,
) -> Vec<String> {
    #[derive(Clone)]
    struct Sink<'a> {
        original_url: &'a Url,
        returned_vec: Vec<String>,
        fetched_cache: &'a Vec<String>,
    }

    impl<'a> TokenSink for Sink<'a> {
        type Handle = ();

        fn process_token(&mut self, token: Token, _line_number: u64) -> TokenSinkResult<()> {
            trace!("token {:?}", token);
            match token {
                TagToken(tag) => {
                    if tag.kind == StartTag && tag.attrs.len() != 0 {
                        let _attribute_name = get_attribute_for_elem(&tag.name);

                        if _attribute_name == None {
                            return TokenSinkResult::Continue;
                        }
                        let attribute_name = _attribute_name.unwrap();

                        for attribute in &tag.attrs {
                            if &attribute.name.local != attribute_name {
                                continue;
                            }

                            trace!("element {:?} found", tag);
                            add_urls_to_vec(
                                repair_suggested_url(
                                    self.original_url,
                                    (&attribute.name.local, &attribute.value),
                                ),
                                &mut self.returned_vec,
                                &self.fetched_cache,
                            );
                        }
                    }
                }
                ParseError(error) => {
                    warn!("error parsing html for {}: {:?}", self.original_url, error);
                }
                _ => {}
            }
            return TokenSinkResult::Continue;
        }
    }

    let html = Sink {
        original_url: original_url,
        returned_vec: Vec::new(),
        fetched_cache: fetched_cache,
    };

    let mut byte_tendril = ByteTendril::new();
    {
        let tendril_push_result = byte_tendril.try_push_bytes(&raw_html.into_bytes());

        if tendril_push_result.is_err() {
            warn!("error pushing bytes to tendril: {:?}", tendril_push_result);
            return Vec::new();
        }
    }

    let mut queue = BufferQueue::new();
    queue.push_back(byte_tendril.try_reinterpret().unwrap());
    let mut tok = Tokenizer::new(html.clone(), std::default::Default::default()); // default default! default?
    let feed = tok.feed(&mut queue);

    return html.returned_vec;
}

输出结束时没有警告(并且由于 this 为空而由另一个函数引起的 panic )。谁能帮我弄清楚这是怎么回事?

提前致谢。

最佳答案

当我初始化 Tokenizer ,我使用:

let mut tok = Tokenizer::new(html.clone(), std::default::Default::default());

问题是我告诉 Tokenizer 使用 html.<b>clone()</b>而不是 html .因此,它正在写 returned_vec到克隆的对象,而不是 html .更改一些内容(例如使用具有可变引用的变量)可以解决此问题。

关于rust - 可从方法访问但不能从外部访问的结构属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49859102/

相关文章:

rust - Hello World Rust 程序编译,但执行结果为 No authorization 错误

rust - HashMap 中的生命周期,其中键指的是值

rust - 变量值未移动

string - 我应该实现 Display 还是 ToString 来将类型呈现为字符串?

rust - 跨多个特征借用数据时如何编写适当的通用函数签名

rust - 如何为包含字符串的类型(或任何未实现复制的类型)实现复制和克隆?

rust - 将非复制变量移动到异步闭包 : captured variable cannot escape `FnMut` closure body

rust - Rust 为什么很难找到传递依赖?

iterator - 在迭代另一个属性时修改结构的一个属性

rust - 如何在reqwest中获取“解码失败”错误中的响应正文?