You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:37:27