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 日 |
#1934 在 Rust 模式
367 次每月下载
用于 37 个crate(29 个直接使用)
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,包括 ObjectClone
、ObjectPartialEq
、ObjectPartialOrd
、ObjectHash
。
为了提高可用性,非对象安全的 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;
}
}