Как добавить состояние к функции в Rust - PullRequest
0 голосов
/ 28 апреля 2019

Rust имеет анонимное закрытие с состоянием.Могу ли я сделать то же самое с именованной функцией?

(неверный псевдокод)

fn counting_function()->i32 {
  let mut static counter = 0;
  counter = counter + 1;
  return counter.clone();
}

Я понимаю, что могу использовать структуры и функции / черты для этого.И я понимаю, что итераторы - правильный способ сделать это.Но если оставить в стороне структуры с чертами и итераторами, могу ли я сделать это без передачи какого-либо бремени (инициализации структуры) вызывающей стороне?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2019

Это потокобезопасный вариант, использующий атомарный:

use std::sync::atomic::{AtomicUsize, Ordering};

fn counting_function() -> usize {
    static COUNTER: AtomicUsize = AtomicUsize::new(0);
    let result = COUNTER.fetch_add(1, Ordering::Relaxed);
    result
}

Но я бы сказал, что на самом деле это запах кода.

0 голосов
/ 28 апреля 2019

Ваш псевдокод почти работает как есть.Чтобы работать с переменной static mut, вам нужно пометить доступ и изменение частей вашего кода как unsafe, поскольку эти операции не являются поточно-ориентированными.

fn counting_function() -> u32 {
    static mut counter: u32 = 0;
    let retval = unsafe { counter };
    unsafe {
        counter += 1;
    }
    retval
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...