#traits #interface #object #query #dynamically #dynamic #access

query_interface

动态查询任何泛型对象的 trait 实现

8 个版本

使用旧的 Rust 2015

0.3.5 2018 年 3 月 24 日
0.3.4 2018 年 3 月 23 日
0.3.3 2016 年 9 月 8 日
0.2.0 2016 年 9 月 4 日
0.1.0 2016 年 9 月 4 日

#1934Rust 模式

Download history 183/week @ 2024-04-01 90/week @ 2024-04-08 123/week @ 2024-04-15 136/week @ 2024-04-22 126/week @ 2024-04-29 137/week @ 2024-05-06 124/week @ 2024-05-13 128/week @ 2024-05-20 110/week @ 2024-05-27 98/week @ 2024-06-03 100/week @ 2024-06-10 98/week @ 2024-06-17 126/week @ 2024-06-24 72/week @ 2024-07-01 56/week @ 2024-07-08 106/week @ 2024-07-15

367 次每月下载
用于 37 个crate(29 个直接使用)

MIT/Apache

28KB
512 行代码(不含注释)

query_interface

动态查询任何泛型对象的 trait 实现

文档

示例

#[macro_use]
extern crate query_interface;

use query_interface::{Object, ObjectClone};
use std::fmt::Debug;

#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
struct Foo;

interfaces!(Foo: ObjectClone, Debug, Bar);

trait Bar {
    fn do_something(&self);
}
impl Bar for Foo {
    fn do_something(&self) {
        println!("I'm a Foo!");
    }
}

fn main() {
    let obj = Box::new(Foo) as Box<Object>;
    let obj2 = obj.clone();
    println!("{:?}", obj2);
   
    obj2.query_ref::<Bar>().unwrap().do_something();  // Prints: "I'm a Foo!"
}

简而言之,这允许您传递 Object 并仍然可以访问底层类型实现的任何(对象安全的)trait。该库还提供了一些有用的对象安全等效的常用 trait,包括 ObjectCloneObjectPartialEqObjectPartialOrdObjectHash

为了提高可用性,非对象安全的 trait 版本直接实现在 Object trait 对象上,允许您轻松克隆 Object 并将其存储在集合中。

您可以使用 mopo! 宏拥有自己的类似于 Object 的 trait,以通过静态要求强制执行一些附加操作

trait CustomObject : Object {
    ...
}
mopo!(CustomObject);

struct Foo;
interfaces!(Foo: CustomObject);

impl CustomObject for Foo {
    ...
}

现在您可以使用 CustomObject 以您可以使用 Object 的所有方式使用。

使用“动态”功能,您可以在运行时注册要查询的类型上的附加 trait。这允许您绕过正常的协同规则

trait Custom {}
impl Custom for String {}

fn main() {
    dynamic_interfaces! {
        String: Custom;
    }
}

依赖