Как реализованы черты объектов в Rust?
Я пытаюсь понять, как черты объектов реализованы в Rust. Пожалуйста, дайте мне знать, если следующее понимание верно.
У меня есть функция, которая принимает любой тип, который реализует Write
черта характера:
fn some_func(write_to: &mut Write) {}
В любом месте, где у нас есть тип, который реализует эту черту и вызывает вышеуказанную функцию, компилятор генерирует "объект черты", возможно, добавляя вызов TraitObject::new(data, vtable)
,
Если у нас есть что-то вроде:
let input = get_user_input(); // say we are expecting the input to be 1 or 2
let mut file = File::new("blah.txt").unwrap();
let mut vec: Vec<u8> = vec![1, 2, 3];
match input {
1 => some_func(&mut file),
2 => some_func(&mut vec),
}
вероятно, окажется:
match input {
1 => {
let file_write_trait_object: &mut Write =
TraitObject::new(&file, &vtable_for_file_write_trait);
some_func(file_write_trait_object);
}
2 => {
let vec_write_trait_object: &mut Write =
TraitObject::new(&vec, &vtable_for_vec_write_trait);
some_func(vec_write_trait_object);
}
}
внутри some_func
компилятор просто получит доступ к методам, используемым на основе vtable в TraitObject
прошло вместе.
1 ответ
Решение
Объекты черты - жирные указатели, так fn some_func(write_to: &mut Write)
компилируется в нечто вроде fn some_func(_: *mut OpaqueStruct, _: *const WriteVtable)
,