我正在编写一个扩展的Rust编译器插件
choose! {
test_a
test_b
}
Run Code Online (Sandbox Code Playgroud)
至
#[cfg(feature = "a")]
mod test_a;
#[cfg(feature = "b")]
mod test_b;
Run Code Online (Sandbox Code Playgroud)
它现在几乎完成,但模块在最终扩展的代码中不包含任何内容.我猜原因是跨度不包括模块文件.
use syntax::ast;
use syntax::ptr::P;
use syntax::codemap;
use syntax::parse::token;
use syntax::tokenstream::TokenTree;
use syntax::ext::base::{ExtCtxt, MacResult, DummyResult, MacEager};
use syntax::ext::build::AstBuilder;
use syntax_pos::Span;
use rustc_plugin::Registry;
use syntax::util::small_vector::SmallVector;
// Ideally, it will expand
//
// ```rust
// choose! {
// test_a
// test_b
// }
// ```
// to
// ```rust
// #[cfg(feature = "a")]
// mod test_a;
// #[cfg(feature = "b")]
// mod test_b;
// ``` …Run Code Online (Sandbox Code Playgroud) 我已阅读如何从Rust中的文件读取结构?,但std::slice::raw::mut_buf_as_slice已被弃用,因此我想重新提出这个问题.
我想读一个struct utmp来自/var/run/utmp,我尝试了以下代码:
fn read_utmp() -> Utmp {
let mut reader = BufReader::new(File::open("/var/run/utmp").unwrap());
let mut ut = vec![];
let size = mem::size_of::<Utmp>();
reader.take(size as u64).read_to_end(&mut ut);
unsafe {
std::mem::transmute(ut)
}
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,编译器投诉:
错误:使用不同大小的类型调用transmute:std :: vec :: Vec(192位)到Utmp(3056位)[E0512]
我怎么能这样做?
我想编写一个解析文本的函数,但文本可能来自外部文件或内部文件&str.该parse功能可能如下所示:
fn parse(lines: GenericLinesGenerator) {
for line in lines {
// parse content
}
}
Run Code Online (Sandbox Code Playgroud)
......它可以像这样调用:
use std::io::BufReader;
use std::fs::File;
let fin = BufReader::new(File::open("info.txt").expect("not found"));
parse(TransformFromIO(fin.lines()))
Run Code Online (Sandbox Code Playgroud)
要么
let content: &'static str = "some\nlong\ntext";
parse(TransformFromStr(content.lines()))
Run Code Online (Sandbox Code Playgroud)
是否可以实现这样的parse功能?