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

Ben*_*rdt 6 struct traits rust pageobjects selenium-webdriver

是否可以要求结构具有特定字段作为特征的一部分?我正在使用 Rust 中的 Thirdfour_sync 箱进行一些网络自动化。我想为将实现它们的页面对象编写一些具有默认实现的特征。基本上,我知道每个要实现此特征的结构都会有一个名为“driver”的字段,该字段保存对 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:\"]"))?;
   | |                              ^^^^^^
...  |

Run Code Online (Sandbox Code Playgroud)

有没有办法让编译器知道任何实现此特征的东西都将具有 &WebDriver 类型的字段驱动程序?

Ben*_*rdt 4

我在起草问题时发现了问题的答案。不,您无法从特征访问字段。作为解决方案,我向特征添加了 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
Run Code Online (Sandbox Code Playgroud)

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

  • 好答案!是的,你是对的。某些语言(例如 Kotlin)允许接口指定类似属性的值,但 Rust 认为方法调用在语法上应始终类似于方法调用,而字段访问应始终类似于字段访问。因此,拥有“get_driver”方法是正确的方法 (2认同)