如何访问与公用函数同名的struct字段?

时间:2018-10-02 18:45:29

标签: rust

我正在尝试访问已实例化的特定clap::App的版本。但是,字段version和公共功能version()

一样存在

以下是源代码的相关内容:

pub struct App<'a, 'v, 'ab, 'u, 'h, 'ar> {
    // ...
    version: Option<&'v str>,
    // ...
}

impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
    // ...
    pub fn version(mut self, v: &'v str) -> Self {
        self.version = Some(v);
        self
    }
    // ...
}

我的代码:

pub fn build_cli() -> App<'static, 'static> {
    App::new("my-pi")
        .version("0.1.0")
// ...

let app = build_cli();
assert_eq!(app.version, "0.1.0"); // <-- Error here

version上同时存在字段version()和功能App。怎么会这样?以及如何访问字段version

错误:

error[E0615]: attempted to take value of method `version` on type `clap::App<'_, '_>`
  --> src/cli.rs:27:21
   |
27 |         assert_eq!(app.version, "0.1.0");
   |                        ^^^^^^^
   |
   = help: maybe a `()` to call it is missing?

2 个答案:

答案 0 :(得分:6)

  

怎么可能?

语言的定义方式使字段和方法之间没有冲突。

  

如何访问字段版本?

您不能:它是私有的,没有getter方法。

答案 1 :(得分:5)

通过访问该字段,您将访问一个与函数名称相同的字段:

struct Example {
    foo: i32,
}

impl Example {
    fn foo(&self) -> i32 {
        self.foo + 100
    }
}

fn main() {
    let ex = Example { foo: 42 };

    println!("{}", ex.foo);
    println!("{}", ex.foo());
}

假定没有括号,您需要该字段的值。

另请参阅: