Я хочу добавить свою собственную функцию в уже существующую структуру, которую я не могу контролировать. В качестве конкретного примера я хочу создать экземпляр std::fs::File
let logfile = std::fs::OpenOptions::new().create(true).open("file.txt").unwrap();
Затем я хочу как-то создать свою функцию fn foo()
, чтобы потом можно было сделать logfile.foo();
Я не уверен, что это вообще возможно, если честно.
Это именно то, для чего можно использовать черты. См. «Признаки: определение общего поведения» в 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();
}
Есть ли в вашем экземпляре особая информация, на которую опирается
foo
, или вся информация уже есть в экземпляреFile
? Если вся информация уже находится в экземпляреFile
, вы можете просто создать трейт с помощью методаfoo
, а затем реализовать его дляFile
.