Как получить доступ к полю структуры, имя которого совпадает с именем публичной функции? - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь получить доступ к версии конкретного 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 голосов
/ 02 октября 2018

Вы получаете доступ к полю, имя которого совпадает с функцией, если обращается к полю :

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

Предполагается, что без скобок требуется значение поля.

См. Также:

0 голосов
/ 02 октября 2018

Как это может быть?

Язык определен таким образом, что нет конфликта между полями и методами.

Как я могуполучить доступ к полевой версии?

Вы не можете: она является закрытой и не имеет метода получения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...