Struct 将结构对象强制转换为动态特征对象

Struct 将结构对象强制转换为动态特征对象,struct,rust,casting,traits,Struct,Rust,Casting,Traits,这是我的代码的更简单版本: type Res=结果; //预先定义 公共特征属性{ fn方法(&self)->Res; } //结构,用户提供的代码块 //目前还不清楚 pub结构; //为提供的结构实现的特性 //用户手动执行此操作 //目前还不清楚 S的impl Attr{ fn方法(&self)->Res{ 好(()) } } //为了使用struct及其实现方法 //一种可能的方法是将struct type强制转换为dynamictrait对象 类型项目=dyn Fn(&dyn Attr

这是我的代码的更简单版本:

type Res=结果;
//预先定义
公共特征属性{
fn方法(&self)->Res;
}
//结构,用户提供的代码块
//目前还不清楚
pub结构;
//为提供的结构实现的特性
//用户手动执行此操作
//目前还不清楚
S的impl Attr{
fn方法(&self)->Res{
好(())
}
}
//为了使用struct及其实现方法
//一种可能的方法是将struct type强制转换为dynamictrait对象
类型项目=dyn Fn(&dyn Attr)->Res;
pub fn使用_方法(f:&Item){}
fn main(){
//铸造在这里进行
//在宏中完成这项工作,这里是简化版
设m=&(::方法)为&Item;
使用_法(m);
}
它需要处理结构、代码块及其实现,这两者都是未知的,并且由用户提供。粗略的方向可能是使用从struct对象转换的特征作为动态特征边界,但编译器抱怨:

error[E0631]:函数参数中的类型不匹配
-->src/main.rs:30:13
|
4 | fn方法(&self)->Res;
|---------------------------找到“for”的签名_`
...
30 |设m=&(::方法)为&Item;

|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^预期签名为` for Fn(&'r(dyn Attr+'r))->std::result::ResultI不太理解您的问题,但
method()
接受对实现
Attr
特征的类型的共享引用
包含一个接受Attr trait对象的
Fn
。它们不一样。所以我想不可能选演员。如果将
method()
的定义更改为与
具有相同的签名,则它应该可以工作。更改“method()”的签名,因为无法将特征“Attr”生成对象。这就是为什么我在
method()
上放置了
where Self:Sized
,以使特定的方法对象不安全。trait对象仍然可以构造。我在上面添加了一个游乐场链接,它可以实现这一点,也可以编译。这里:你能用闭包代替吗?例如,
m=|s:&dyn Attr|s.method();使用_方法(&m)?我不太理解您的问题,但是
method()
接受对实现
Attr
trait的类型的共享引用
包含一个接受Attr trait对象的
Fn
。它们不一样。所以我想不可能选演员。如果将
method()
的定义更改为与
具有相同的签名,则它应该可以工作。更改“method()”的签名,因为无法将特征“Attr”生成对象。这就是为什么我在
method()
上放置了
where Self:Sized
,以使特定的方法对象不安全。trait对象仍然可以构造。我在上面添加了一个游乐场链接,它可以实现这一点,也可以编译。这里:你能用闭包代替吗?例如,
m=|s:&dyn Attr|s.method();使用_方法(&m)