在宏里访问结构体的成员 - rust
2015-12-09 16:02
302 查看
目前在rust的宏里直接访问结构体的成员是不可行的,但是可以通过变通的方法来做
例如下面的代码就是不可行的,
因为宏里可以访问全局函数,所以可以曲线来访问结构体成员
这些全局函数加上了
play网址:https://play.rust-lang.org/?gist=454b5441c1db5dc6a1e1&version=stable
运行结果:
例如下面的代码就是不可行的,
$m.id或者
$m.code会提示出错
macro_rules! msg { ($id:expr,$code:expr,$f:ident,$m:ident)=>{ if $id == $m.id && $code == $m.code { ... } } }
因为宏里可以访问全局函数,所以可以曲线来访问结构体成员
这些全局函数加上了
inline,理论上这个曲线方法和直接访问结构体成员的性能是一样的
#[derive(Debug)] struct Event{ hwnd: usize, msg: u32, r: u32, wparam: usize, lparam: usize, } impl Event{ #[inline(always)] fn get_id(&self)->u16 { (self.wparam & 0xFFFF) as u16 } #[inline(always)] fn get_code(&self)->u16{ ((self.wparam >> 16) & 0xFFFF) as u16 } #[inline(always)] fn set_result(&mut self,r:u32){ self.r=r; } } macro_rules! msg { ($id:expr,$code:expr,$f:ident,$e:ident)=>{ if $id == Event::get_id($e) && $code == Event::get_code($e) { $f($e); } } } fn bar(e: &mut Event){ e.set_result(300); println!("{:?}",e); } fn foo(e: &mut Event){ msg!(100,200,bar,e); } fn main(){ let mut e = Event{hwnd:0,msg:0,r:0,wparam:0xc80064,lparam:0}; foo(&mut e); }
play网址:https://play.rust-lang.org/?gist=454b5441c1db5dc6a1e1&version=stable
运行结果:
Event { hwnd: 0, msg: 0, r: 300, wparam: 13107300, lparam: 0 }
相关文章推荐
- MVC 页面实现ajax刷新联动下拉列表
- Ansible@一个有效的配置管理工具--Ansible configure management--翻译(四)
- php封装文件上传
- 分词 正文提取 java
- 如何在python中读写和存储matlab的数据文件(*.mat)
- 1209实验三评论
- SQL语句2
- 【翻译】使用Sencha Ext JS创建美丽的图画(1)
- C:set 标签设置(绝对路径的设置)
- 数据结构之自建算法库——图及其存储结构
- (八十六)switch语句
- 蜗牛—JSONJ学习ava转变
- 实验三同学评论
- HDU 1003 Max Sum
- jpg Test
- mysql远程机器导入导出数据 锁表不锁表 部分数据或全部
- 仿微信图片预览
- No Database Selected
- 常见的shell 命令
- 滑动返回的幸福指数