Как реализованы черты объектов в 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),

Другие вопросы по тегам