lazy_static вызывает ошибку, так как «токен не ожидается правил» - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь использовать lazy_static ящик для инициализации некоторых статических переменных, которым присвоены значения, путем чтения некоторых переменных среды в build.rs. То, что я пытаюсь достичь, похоже на этот пост .

Мой код следующий:

lazy_static! {

static _spdk_dir : String = match env::var("SPDK_DIR") {
    Ok(val) => val,
    Err(_e) => panic!("SPDK_DIR is not defined in the environment")
};

static _dpdk_dir: String = match env::var("DPDK_DIR") {
    Ok(val) => val,
    Err(_e) => panic!("DPDK_DIR is not defined in the environment")
};
}

После запуска cargo test компилятор выдаст error: no rules expected the token _spdk_dir. Я могу избавиться от этой ошибки, добавив ключевое слово ref после static но это приведет к другой ошибке при использовании переменной с println!:

println!("cargo:warning={}", _spdk_dir);

Ошибка _spdk_dir doesn't implement std::fmt::Display

Мне интересно, как я могу решить проблему? Спасибо!

1 Ответ

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

Под капотом lazy_static создает одноразовый объект, который разыменовывается к фактическому значению, которое вычисляется лениво. _spdk_dir - это не String, а значение, которое оценивается как String. Вы должны разыменовать значение, чтобы напечатать его. Еще одна вещь, которую вы можете сделать, это использовать unwrap_or_else вместо match:

lazy_static! {
    static ref _spdk_dir: String = env::var("SPDK_DIR")
        .unwrap_or_else(|_| panic!("SPDK_DIR is not defined in the environment"));
    static ref _dpdk_dir: String = env::var("DPDK_DIR")
        .unwrap_or_else(|_| panic!("DPDK_DIR is not defined in the environment"))
}

println!("cargo:warning={}", *_spdk_dir);

(ref является частью синтаксиса lazy_static, поэтому вы не можете его оставить).

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