Как получить доступ к переменным ржавчины вне области? - PullRequest
0 голосов
/ 26 января 2020

Мой код выглядит следующим образом

fn main() {
    // some other codes goes here
    let int = 1;
    if int == 1 {
        let x = "yes";
    } else {
        let x = "no";
    }
    if x == "yes" {
        // some other codes goes here
        println!("yes");
    } else if x == "no" {
        // some other codes goes here
        println!("no")
    }
}

Когда я запускаю это, я получаю это

error[E0425]: cannot find value `x` in this scope
 --> src/main.rs:9:8
  |
9 |     if x == "yes" {
  |        ^ not found in this scope

error[E0425]: cannot find value `x` in this scope
  --> src/main.rs:12:15
   |
12 |     } else if x == "no" {
   |               ^ not found in this scope

При поиске решения я наткнулся на этот пост Как получить доступ переменная вне выражения `if let`? но не может понять причину или ее решение?

Ответы [ 4 ]

3 голосов
/ 26 января 2020

Самым простым является его кодирование таким образом, чтобы оно вошло в область видимости в первую очередь. Вы можете назначить переменную с результатом оператора в одном назначении. Если вы можете сделать это как одну строку, это также делает его, возможно, более читабельным. Если фактическая обработка слишком длинная, ничто не мешает вам просто ... сделать ее правильной функцией.

let x = if int == 1 { "yes" } else { "no" };
// rest of the code accessing x.

В качестве альтернативы, компилятор позволит вам объявлять неназначенные переменные, если вы правильно назначите их позже, со всеми проверки безопасности во время компиляции на месте. Прочтите документы по RAII (Инициализация ресурсов - инициализация) Документы RAII , чтобы узнать, как это работает. На практике это так просто:

let x;
if i == 1 {
    x = "yes";
}
else {
    x = "no";
}
// keep doing what you love

Компилятор выдаст ошибку, если есть путь logi c, где x не инициализируется, или если он инициализируется как другой тип. Обратите внимание, что вам также не нужно объявлять его как mut, так как первое полученное значение останется неизменным. Если, конечно, вы не захотите потом изменить это.

1 голос
/ 26 января 2020

Вы не можете получить доступ к переменной, которая находится вне области видимости. Но вы используете обходной путь и устанавливаете переменную в той же области видимости.

fn main(){
    let int = 1;
    let x = if int == 1 {
        "yes"
    } else {
        "no"
    };

    if x == "yes" {
        println!("yes");
    } else if x == "no" {
        println!("no");
    }
}
0 голосов
/ 26 января 2020

В Rust каждая переменная имеет область, которая начинается там, где переменная инициализирована. В вашей задаче вы пытаетесь использовать переменную x, которая создается внутри if int == 1 и if x == "yes", поскольку если операторы имеют отдельную область видимости от функции main, вы не можете создать переменную внутри вашего оператора if и ожидайте, что это не будет очищено, когда вы покинете область. Самое простое решение - инициализировать переменную x там, где вы хотите, чтобы она использовалась в if x == "yes", поэтому позвольте сказать, что мы хотим, чтобы область действия x начиналась в main положить let x; в main. В Rust переменная из более широкой области видимости может быть видна областям, находящимся в этой более широкой области, где переменная инициализируется, поэтому назначение переменной из области действия оператора if совершенно допустимо.

Пожалуйста, примите посмотрите на https://doc.rust-lang.org/rust-by-example/variable_bindings/scope.html для получения дополнительной информации.

fn main() {
    let x;
    // some other codes goes here
    let int = 1;
    if int == 1 {
        x = "yes";
    } else {
        x = "no";
    }
    if x == "yes" {
        // some other codes goes here
        println!("yes");
    } else if x == "no" {
        // some other codes goes here
        println!("no")
    }
}

Но вы можете избавиться от двух операторов if и просто использовать match:

fn main() {
    let myint = 1;

    match myint {
        1 => {println!("yes")}
        _ => {println!("no")}
    }
}
0 голосов
/ 26 января 2020

Вопрос

Я полагаю, вы спрашиваете что означает эта ошибка ?

Чтобы ответить на этот вопрос, нужно сначала ответить, что такое область действия ?

Ответ

Область, в терминах непрофессионала, - это фрагмент кода, в котором существует переменная.

Таким образом, когда ошибка говорит, что не найдена в этой области , это означает, что переменная здесь не существует.

Пример

fn main() {
    let a_bool = true;
    let main_scope_x = 0;

    if a_bool == true {
        let if_scope_x = 1;
    } // if_scope_x stops existing here!

    println!("main x has the value {}", main_scope_x);
    println!("if x has the value {}", if_scope_x); // this will cause an error, if_scope_x does not exist outside the if expression.
}

Дополнительная информация

https://doc.rust-lang.org/stable/book/ch04-01-what-is-ownership.html (Прочтите книгу! Это очень хорошо!)

...