向预先存在的结构添加功能[重复]

Posted

技术标签:

【中文标题】向预先存在的结构添加功能[重复]【英文标题】: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 实现它。 【参考方案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();

【讨论】:

以上是关于向预先存在的结构添加功能[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从文本文件导入数据时向预先存在的字典键添加值(Python 3)

如何向云 Firestore 中的对象添加新属性 [重复]

无法向 Mongoose 查询返回的对象添加新属性 [重复]

无法向 Mongoose 查询返回的对象添加新属性 [重复]

向java添加新库[重复]

java怎么判断集合中是不是存在重复数据,如果存在怎么删除重复数据