【问题标题】:Check if property or method exists at runtime? Check if Trait exists at runtime?检查运行时是否存在属性或方法?检查 Trait 在运行时是否存在?
【发布时间】:2017-07-12 05:43:09
【问题描述】:

寻找正确的方法

if(self.MyProperty) { /* ... */ }

错误:尝试访问类型 MyType 上的字段 MyProperty,但未找到具有该名称的字段

if(self.MyMethod){ /* ... */ }

错误:试图在类型 MyType 上获取方法 MyMethod 的值

作为最后的手段,至少如何检查某个 Trait 是否已实现?

【问题讨论】:

  • 这些是编译时错误;为什么需要任何其他方式来检查它们?
  • 我发布了描述的错误。我可能只需要在运行时检查这些,因为我的元素是异构的,并且有一些动态逻辑,例如处理事件。 rust 是否支持检查现有字段或方法?
  • 你的元素是如何异构的?你有Vec<Box<Trait>>吗?
  • 是的,这就是我正在使用的 - 它从该特征方法委托给其他方法,例如 self.Controller.Method1。我仍处于设计阶段,是 Rust 的新手。

标签: methods properties rust traits


【解决方案1】:

Rust 中不存在这个概念。虽然通过Any 有一些有限的向下转换能力,但这应该作为最后的手段。您应该做的是创建一个新特征,为您公开所有这些决定。

重用您的 my_method 方法示例:

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))
    }
}

然后你可以在你的代码中调用

if let Some(result) = self.try_my_method() {
    /* ... */
}

【讨论】:

  • 好的。感谢你的回答。我以前见过这个,但它不适用于完全模块化的设计。希望我只是不需要在运行时检查。
  • (例如,如果为特定元素创建了新的特征,那么所有元素基本上都需要这个“空”特征来补偿)
  • @HTDE 你确定你不想使用枚举吗?另一种选择是提供fn has_my_xyztrait(&amp;self) -&gt; Option&lt;&amp;XYZTrait&gt;,它向下转换为只有某些元素可能实现的特定特征。这样,您只需针对每个特征执行此操作,而不是针对每个方法或字段。
  • 注意:如果你的库的用户不需要创建新的元素类型,你绝对应该使用枚举。
  • 我同意!我试图理解关于贬低特定特征的第一条评论。有我可以查看的示例或文档吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多