root_element
, который на самом деле является ElementRef
, имеет ссылку на объекты внутри doc
, а не на фактический принадлежащий объект. Здесь объект doc
создается в функции from_html
и поэтому принадлежит этой функции. Поскольку doc
не возвращается, он удаляется / удаляется из памяти в конце from_html
функционального блока.
ElementRef
нуждается в doc
, то, на что он ссылается, чтобы быть живым, когда он возвращается из памяти.
pub mod diff_html {
use scraper::{element_ref::ElementRef, Html};
pub struct DiffNode<'a> {
node_ref: ElementRef<'a>,
}
impl<'a> DiffNode<'a> {
fn from_html(html: &'a scraper::html::Html) -> Self {
Self {
node_ref: html.root_element(),
}
}
}
pub fn diff<'a>(html1_string: &str, _html2_string: &str) {
let html1 = Html::parse_document(&html1_string);
let diff1 = DiffNode::from_html(&html1);
// do things here
// at the end of the function, diff1 and html1 is dropped together
// this way the compiler doesn't yell at you
}
}
Более или менее вам нужно сделать что-то подобное с функцией diff, чтобы значения времени жизни HTML и ElementRef были одинаковыми.
Это На самом деле поведение - это функция Rust для защиты значений в памяти, чтобы они не просачивались и не ссылались, не ссылаясь на неправильный адрес памяти.
Также, если вы хотите работать с отсоединяемыми объектами и играть со ссылкой (например, * 1024) *, javascript, golang) Предлагаю прочитать это https://doc.rust-lang.org/book/ch15-05-interior-mutability.html