Methods 检查运行时是否存在属性或方法?检查运行时特征是否存在?
寻找正确的方法去做Methods 检查运行时是否存在属性或方法?检查运行时特征是否存在?,methods,properties,rust,traits,Methods,Properties,Rust,Traits,寻找正确的方法去做 if(self.MyProperty) { /* ... */ } 错误:尝试访问类型MyType上的字段MyProperty,但未找到具有该名称的字段 或 错误:试图在类型MyType 作为最后的手段,至少应该如何检查一个特征是否被实现?这个概念在Rust中并不存在。虽然通过Any的下行能力有限,但这应该作为最后的手段。你应该做的是创造一种新的特质,让你暴露所有这些决定 重复使用my_方法的示例方法: trait YourTrait { fn try_my_met
if(self.MyProperty) { /* ... */ }
错误:尝试访问类型MyType
上的字段MyProperty
,但未找到具有该名称的字段
或
错误:试图在类型MyType
作为最后的手段,至少应该如何检查一个特征是否被实现?这个概念在Rust中并不存在。虽然通过
Any
的下行能力有限,但这应该作为最后的手段。你应该做的是创造一种新的特质,让你暴露所有这些决定
重复使用my_方法的示例
方法:
trait YourTrait {
fn try_my_method(&self, arg: SomeArg) -> Option<MyMethodResult> {
None
}
}
impl YourTrait for SomeType {
fn try_my_method(&self, arg: SomeArg) -> Option<MyMethodResult> {
Some(self.my_method(arg))
}
}
这个概念在Rust中并不存在。虽然通过
Any
的下行能力有限,但这应该作为最后的手段。你应该做的是创造一种新的特质,让你暴露所有这些决定
重复使用my_方法的示例
方法:
trait YourTrait {
fn try_my_method(&self, arg: SomeArg) -> Option<MyMethodResult> {
None
}
}
impl YourTrait for SomeType {
fn try_my_method(&self, arg: SomeArg) -> Option<MyMethodResult> {
Some(self.my_method(arg))
}
}
这些是编译时错误;为什么您需要任何其他方式来检查它们?我正在发布描述中的错误。我可能只需要在运行时检查这些,因为我的元素是异构的,并且有一些动态逻辑,例如,处理事件。rust支持检查现有字段或方法吗?元素如何异构?你有
Vec
?是的,这就是我正在使用的——它将traits方法委托给其他方法,比如self.Controller.Method1。我还处于设计阶段,还没有开始生锈;为什么您需要任何其他方式来检查它们?我正在发布描述中的错误。我可能只需要在运行时检查这些,因为我的元素是异构的,并且有一些动态逻辑,例如,处理事件。rust支持检查现有字段或方法吗?元素如何异构?你有Vec
?是的,这就是我正在使用的——它将traits方法委托给其他方法,比如self.Controller.Method1。我还在设计阶段,还没开始生锈。谢谢你的回答。我以前见过这种情况,但它不适用于完全模块化的设计。希望我不需要在运行时进行检查(例如,如果为某个特定元素创建了新特征,那么所有元素基本上都需要这个“空”特征来进行补偿)@HTDE您确定不想使用枚举吗?另一种选择是提供一个fn has_my_xyztrait(&self)->选项
,该选项可降级为只有某些元素可能实现的特定特性。这样,您只需按每个特征而不是按每个方法或字段执行此操作。注意:如果库的用户不需要创建新的元素类型,则绝对应该使用枚举。我同意!我试图理解第一条关于贬低某一特定特质的评论。是否有我可以查看的示例或文档?谢谢好啊谢谢你的回答。我以前见过这种情况,但它不适用于完全模块化的设计。希望我不需要在运行时进行检查(例如,如果为某个特定元素创建了新特征,那么所有元素基本上都需要这个“空”特征来进行补偿)@HTDE您确定不想使用枚举吗?另一种选择是提供一个fn has_my_xyztrait(&self)->选项
,该选项可降级为只有某些元素可能实现的特定特性。这样,您只需按每个特征而不是按每个方法或字段执行此操作。注意:如果库的用户不需要创建新的元素类型,则绝对应该使用枚举。我同意!我试图理解第一条关于贬低某一特定特质的评论。是否有我可以查看的示例或文档?谢谢
if let Some(result) = self.try_my_method() {
/* ... */
}