【问题标题】:Require a field as part of a Rust trait需要一个字段作为 Rust 特征的一部分
【发布时间】:2021-06-29 02:31:05
【问题描述】:

是否可以要求结构具有特定字段作为 trait 的一部分?我在 Rust 中使用 threefour_sync crate 做一些网络自动化。我想为将实现它们的页面对象编写一些具有默认实现的特征。基本上,我知道一个事实,即每个要实现此特征的结构都会有一个名为“驱动程序”的字段,其中包含对 WebDriver 结构的引用。我想在我的特征的默认实现中使用这个驱动程序字段。

error[E0609]: no field `driver` on type `&Self`
  --> src\base_order_details.rs:13:30
   |
10 | / pub trait BaseOrderDetails {
11 | |
12 | |     fn oid(&self) -> WebDriverResult<String> {
13 | |         let oid_title = self.driver.find_element(By::XPath("//*[text()=\"Order ID:\"]"))?;
   | |                              ^^^^^^
...  |

有没有办法让编译器知道任何实现这个特性的东西都会有一个 &WebDriver 类型的字段驱动程序?

【问题讨论】:

标签: selenium-webdriver struct rust traits pageobjects


【解决方案1】:

我在起草问题时发现了问题的答案。不,您不能从特征访问字段。作为一种解决方案,我在 trait 中添加了一个 get_driver 方法并在默认实现中使用它,因此用户可以简单地实现 get_driver 方法并将其余部分默认。

pub trait BaseOrderDetails {

    fn get_driver(&self) -> &WebDriver;

    fn oid(&self) -> WebDriverResult<String> {
        let oid_title = self.get_driver().find_element(By::XPath("//*[text()=\"Order ID:\"]"))?;

        // do some other stuff

我在 Rust Book 关于特征的章节中找到了这个解决方案,在 Default Implementations 下:https://doc.rust-lang.org/book/ch10-02-traits.html

【讨论】:

  • 好答案!是的,你是对的。一些语言,比如 Kotlin,允许接口指定类似属性的值,但 Rust 认为方法调用在语法上应该总是看起来像方法调用,而字段访问应该总是看起来像字段访问。所以拥有get_driver 方法是正确的方法
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2013-01-29
相关资源
最近更新 更多