Rust 闭合、RefCell、Rc 计数 [已关闭]

Rust closure, RefCell, Rc Count [closed]

提问人:안태찬 提问时间:10/27/2023 更新时间:10/27/2023 访问量:46

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

23天前关闭。

counter_clone处于关闭状态。 因此,计数器不会添加,仍保持 0 你介意我问你解决这个问题吗? 谢谢!

/// Implement a function to convert a Church numeral to a usize type.
pub fn to_usize<T: 'static + Default>(n: Church<T>) -> usize {
    use std::cell::RefCell;

    let counter = Rc::new(RefCell::new(0));
    let counter_clone = Rc::clone(&counter);

    let result_func = n(Rc::new(move |x| {
        *counter_clone.borrow_mut() += 1;
        x
    }));

    let _ = result_func(Default::default());

    // Extract the value from the reference-counted cell
    let result = *counter.borrow();

    result
}
防锈 封盖 refcell

评论


答:

1赞 Masklinn 10/27/2023 #1

您没有提供最小可重现示例,并且您的代码段具有多个代码挂钩,这些钩子具有不可知的行为(以及可能的错误)。

像往常一样,选择不会被破坏,并且肯定可以正常工作,包括闭包:RefCellRc

use std::rc::Rc;
use std::cell::RefCell;

fn main() {
    let counter = Rc::new(RefCell::new(0));
    let counter_clone = Rc::clone(&counter);
    
    let f = move || *counter_clone.borrow_mut() += 1;

    dbg!(counter.borrow());
    f();
    dbg!(counter.borrow());
}

指纹

[src/main.rs:10] counter.borrow() = 0
[src/main.rs:12] counter.borrow() = 1

正如人们所期望的那样。

我假设你的 和 是问题所在,并且从未调用过关闭。这是迄今为止最可能的解释。但是,由于您没有提供任何一个,并且 SO 尚未提供我要求的 pyschic 远程读心器,因此这是我所能提供的帮助。nresult_func