是否可以在 Rust 中的回调函数内访问变量,而无需引用计数或互斥体?

问题描述 投票:0回答:1

我是 Rust 的绝对初学者,所以如果我的问题没有用正确的术语表达,我很抱歉,如果需要,我很乐意提供更多说明。

我正在使用

sdl
rlua
编写程序。该程序将加载并运行一个lua脚本,并提供该脚本可以使用的函数。这些函数将允许绘制到 SDL 渲染器。

为了做到这一点,我向 lua 注册的 rust 函数需要访问 SDL 渲染器(或

canvas
,因为它是由这个 SDL 包装器调用的)。

我发现在 lua 回调中访问

canvas
的唯一方法是将其包装在引用计数互斥体中。这允许我维护对它的多个可变引用,因此我可以继续在封闭范围的其余部分中访问它。这是我所拥有的精简版:

extern crate rlua;
extern crate sdl2;

use std::rc::Rc;
use std::sync::Mutex;

fn main() {
    let lua = rlua::Lua::new();

    let sdl = sdl2::init().unwrap();
    let video = sdl.video().unwrap();

    let window = video.window("", 640, 320).resizable().build().unwrap();

    let canvas = Rc::new(Mutex::new(window.into_canvas().build().unwrap()));
    
    let draw_rect_canvas = canvas.clone();
    let draw_rect = lua
        .create_function_mut(move |_, (x, y, w, h): (i32, i32, u32, u32)| {
            draw_rect_canvas
                .lock()
                .unwrap()
                .draw_rect(sdl2::rect::Rect::new(x, y, w, h))
                .unwrap();
            Ok(())
        })
        .unwrap();

    lua.globals().set("draw_rect", draw_rect).unwrap();

    canvas
        .lock()
        .unwrap()
        .set_draw_color(sdl2::pixels::Color::RGB(0, 0, 0));
}

这可以编译,并执行我需要的操作。但是,我想知道引用计数或互斥体是否真的有必要,因为我认为它们会引入少量的运行时开销。

还有其他方法可以告诉编译器以下信息吗?

    只要
  • canvas
     lua 函数
    draw_rect
  • 就会存在
  • lua函数不会与访问的任何其他代码同时执行
    canvas
rust reference-counting
1个回答
0
投票

引用计数和内部可变性看起来是正确的调用,但您绝对应该将

Mutex
替换为
RefCell
,以获得更好的性能和可调试性。

如果您只有一个需要访问画布的函数,并且不需要在主函数中访问它,则可以直接将其

move
放入闭包中,而不需要
Rc<RefCell>
,但看起来这不是案例。

© www.soinside.com 2019 - 2024. All rights reserved.