如何在Rust的impl块中引用结构体成员变量?(含TS转Rust场景)
问题解决方案
1. 结构体成员赋值错误的修复
你遇到的未找到结构体MyStruct的关联项my_variable错误,是因为Self::语法用来访问结构体的关联项(比如关联函数、关联常量),而结构体的实例成员需要通过具体的实例对象来访问。
在new函数里,正确初始化成员的方式是直接构建结构体实例:
struct MyStruct { my_variable: bool, } impl MyStruct { fn new() -> Self { // 直接初始化字段,而非使用Self::赋值 Self { my_variable: true, } } }
如果是在impl的其他方法中修改成员,需要通过self.访问(可变方法需声明&mut self):
impl MyStruct { fn toggle_variable(&mut self) { self.my_variable = !self.my_variable; } }
2. 回调中访问结构体成员的实现
由于web_sys的事件回调是异步的,且Rust的所有权规则严格,直接引用结构体实例会触发生命周期冲突。通常的解决方案是用Rc<RefCell<YourStruct>>包装结构体,实现所有权共享与内部可变性,让闭包能安全访问成员。
以下是模拟Peer类转换的完整示例:
use wasm_bindgen::prelude::*; use web_sys::{RtcPeerConnection, Event}; use std::rc::Rc; use std::cell::RefCell; #[wasm_bindgen] pub struct Peer { pc: RtcPeerConnection, making_offer: bool, } impl Peer { pub fn new() -> Result<Rc<RefCell<Self>>, JsValue> { let pc = RtcPeerConnection::new()?; let peer = Rc::new(RefCell::new(Self { pc, making_offer: false, })); // 克隆Rc实例,供闭包捕获使用 let peer_clone = peer.clone(); pc.set_onicecandidate(Some(&Closure::wrap(Box::new(move |_event: Event| { // 通过RefCell的borrow_mut()获取可变引用,修改成员 let mut peer = peer_clone.borrow_mut(); peer.making_offer = true; // 这里添加你的ICE候选处理逻辑 }) as Box<dyn FnMut(Event)>))); Ok(peer) } }
核心要点:
Rc用于共享结构体的所有权,闭包可以克隆一份Rc引用,避免所有权转移问题RefCell提供内部可变性,允许在看似不可变的上下文中修改结构体成员- 回调闭包需要用
Closure::wrap包装,适配web_sys的回调类型要求
如果回调仅需读取成员而非修改,可使用borrow()替代borrow_mut()。
内容的提问来源于stack exchange,提问作者JSmith
相关产品推荐
相关产品推荐

