Добавить функцию в уже существующую структуру

Я хочу добавить свою собственную функцию в уже существующую структуру, которую я не могу контролировать. В качестве конкретного примера я хочу создать экземпляр std::fs::File

let logfile = std::fs::OpenOptions::new().create(true).open("file.txt").unwrap();

Затем я хочу как-то создать свою функцию fn foo(), чтобы потом можно было сделать logfile.foo();

Я не уверен, что это вообще возможно, если честно.

Есть ли в вашем экземпляре особая информация, на которую опирается foo, или вся информация уже есть в экземпляре File? Если вся информация уже находится в экземпляре File, вы можете просто создать трейт с помощью метода foo, а затем реализовать его для File.

Aplet123 24.12.2020 15:58
Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
4
1
1 908
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это именно то, для чего можно использовать черты. См. «Признаки: определение общего поведения» в Rust Book.

Короче говоря, вы можете определить свой собственный trait Foo и добавить, например. к нему метод fn foo(&self), а затем impl Foo for std::fs::File, который позволяет вызывать logfile.foo().

trait Foo {
    fn foo(&self);
}

impl Foo for File {
    fn foo(&self) {
        println!("foo");
    }
}

Также в вашем OpenOptions отсутствует вызов write() или append() . В противном случае вы получите ошибку InvalidInput.

Вот полный пример:

use std::fs::{File, OpenOptions};

trait Foo {
    fn foo(&self);
}

impl Foo for File {
    fn foo(&self) {
        println!("foo");
    }
}

fn main() {
    let logfile = OpenOptions::new()
        .write(true) // or `.append(true)`
        .create(true)
        .open("file.txt")
        .unwrap();

    logfile.foo();
}

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