Можно ли объявить 2 статические изменяемые переменные в зависимости друг от друга? - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь объявить две статические изменяемые переменные, но у меня ошибка :

static mut I: i64 = 5;
static mut J: i64 = I + 3;

fn main() {
    unsafe {
        println!("I: {}, J: {}", I, J);
    }
}

Ошибка:

error[E0133]: use of mutable static is unsafe and requires unsafe function or block
 --> src/main.rs:2:21
  |
2 | static mut J: i64 = I + 3;
  |                     ^ use of mutable static
  |
  = note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior

Это невозможно? Я также пытался поставить блок unsafe в объявлении , но, похоже, неправильная грамматика:

static mut I: i64 = 5;

unsafe {
    static mut J: i64 = I + 3;
}

1 Ответ

0 голосов
/ 19 ноября 2018

Да, это так.

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

static I: i64 = 5;
static J: i64 = I + 3;

fn main() {
    println!("I: {}, J: {}", I, J);
}

Если вы хотите, чтобы они были изменяемыми, вы можете использовать unsafe для доступа к небезопасной переменной (в данном случае I).

static mut I: i64 = 5;
static mut J: i64 = unsafe { I } + 3;

fn main() {
    unsafe {
        println!("I: {}, J: {}", I, J);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...