#ruby #compile-time #execute #mruby #macro #generate #trough

macro macro-ruby

通过mruby在编译时执行Ruby代码

4个版本 (2个稳定版)

1.1.1 2021年10月7日
1.0.0 2021年10月7日
0.1.1 2021年10月7日
0.1.0 2021年10月6日

#1706 in 过程宏

MIT 协议

21KB
357

macro-ruby

一个在编译时通过Ruby生成Rust代码的crate。(已测试与mruby 3.0.0兼容)

要求

确保你的mrubyPATH中。

如何使用

    use macro_ruby::ruby_code_str;

    // ruby_code_str! generates a &str based on what has been printed from Ruby.
    assert_eq!(
        ruby_code_str!("puts 'hi'"),
        "hi\n"
    );


    assert_eq!(
        ruby_code_str!("print 'hi'"),
        "hi"
    );
    use macro_ruby::ruby_code_to;

    // ruby_code_to! generates a value which type is based off of input
    // and the content on what has been printed from Ruby.
    assert_eq!(
        ruby_code_to!(i32 "print 500+500"),
        1000
    );


    assert_eq!(
        ruby_code_to!(u8 "print 500+500"), // Will panic because u8 overflows
        1000
    );
    use macro_ruby::ruby_code_ast;

    // ruby_code_ast! generates real rust code based on what has been printed
    ruby_code_ast!(r#"
        puts "let a = 1;"
    "#)

    assert_eq!(a, 1);

如果你想从外部文件执行Ruby代码,可以使用我们宏的file变体

字符串版本 文件版本
ruby_code_str! ruby_file_str!
ruby_code_to! ruby_file_to!
ruby_code_ast! ruby_file_ast!

使用YARV代替mruby

如果你想使用YARV(官方Ruby解释器)而不是mruby,只需启用“yarv”或“full”特性(yarv和full是别名)。

所以在我们的cargo.toml中我们将有

[dependencies]
macro-ruby = { version = current_version, features = ["yarv"] }

[dependencies]
macro-ruby = { version = current_version, features = ["full"] }

(其中current_version是macro-ruby的实际当前版本)

无运行时依赖

特性