需要一个字段作为 Rust 特征的一部分

Require a field as part of a Rust trait

是否可以要求结构具有特定字段作为特征的一部分?我正在使用 thirtyfour_sync 板条箱在 Rust 中进行一些 Web 自动化。我想为将实现它们的页面对象编写一些具有默认实现的特征。基本上,我知道一个事实,即每个要实现此特征的结构都会有一个名为“驱动程序”的字段,该字段包含对 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 类型的字段驱动程序?

我在起草问题时找到了问题的答案。不,您不能从特征访问字段。作为解决方案,我向特征添加了一个 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 关于特征的章节中找到了这个解决方案,在默认实现下:https://doc.rust-lang.org/book/ch10-02-traits.html