【问题标题】:Add function to pre-existing struct [duplicate]向预先存在的结构添加功能[重复]
【发布时间】:2021-04-02 23:58:59
【问题描述】:

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

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

然后我想以某种方式创建我自己的函数fn foo(),这样我以后就可以做logfile.foo();

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

【问题讨论】:

  • 您的实例中是否有foo 依赖的特殊信息,或者File 实例中是否已经存在所有信息?如果所有信息都已经在File 实例中,那么您可以简单地使用foo 方法创建一个特征,然后为File 实现它。

标签: function file struct rust


【解决方案1】:

这正是特征可以用来做的事情。请参阅 Rust Book 中的“Traits: Defining Shared Behavior”。

简而言之,您可以定义自己的 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2011-03-15
    • 2016-08-29
    • 1970-01-01
    相关资源
    最近更新 更多