将函数添加到预先存在的结构中

Mar*_*rio 5 struct file function rust

我想将我自己的函数添加到我无法控制的预先存在的结构中。作为具体示例,我想创建一个实例std::fs::File

let logfile = std::fs::OpenOptions::new().create(true).open("file.txt").unwrap();
Run Code Online (Sandbox Code Playgroud)

然后我想以某种方式创建我自己的函数fn foo(),以便我以后能够做到logfile.foo();

老实说,我不确定这是否可能。

Val*_*tin 8

这正是特质的用途。请参阅Rust 书中的“特征:定义共享行为”。

简而言之,您可以定义自己的方法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");
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,您还缺少对或 的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();
}
Run Code Online (Sandbox Code Playgroud)