2016-06-26 6 views
3
foo!(x, y, z); 
// expands to 
fn xx(self) -> T {..} 
fn xy(self) -> T {..} 
... 
fn xxx(self) -> T {..} 
fn xxy(self) -> T {..} 
fn xyz(self) -> T {..} 
fn xzx(self) -> T {..} 
//and so on 
... 

マクロで追加のデータを生成することはできますか?私はベクトルスウィズルを実装したいと思います。 Vector4には多くの組み合わせがあります。 4 + 2^2 + 3^3 + 4^4 = 291の組み合わせマクロは追加データを生成できますか?

私は単純な置き換えの他に何もしていないので、そのようなことが表現できるか、それ?後者は、内蔵されたプラグインに依存macro!

  • 手続きマクロ(不安定)
  • build.rs
  • で宣言

    • マクロ:

    +0

    「追加データ」は非常に一般的な概念です。マクロがマクロ入力に基づいて任意の数の関数を作成できるかどうか本当に尋ねていますか? – Shepmaster

    +0

    @Shepmasterはい私は基本的にマクロ入力の順列を生成したいと思います。 –

    +2

    それから答えは[基本的に](http://stackoverflow.com/q/27415011/155423)です。 (または[this](http://stackoverflow.com/q/24905160/155423))。 (または[this](http://stackoverflow.com/q/23061702/155423))。 – Shepmaster

    答えて

    1

    錆は、コード生成の3つの方法をサポートbuild script特にコード生成/サードパーティライブラリのビルドをサポートしています(Cライブラリなど)。あなたのケースでは

    は、あなたが十分(ドキュメントを引用)シンプルでCode Generation部分で特に興味深いもの:これを考えると

    // build.rs 
    
    use std::env; 
    use std::fs::File; 
    use std::io::Write; 
    use std::path::Path; 
    
    fn main() { 
        let out_dir = env::var("OUT_DIR").unwrap(); 
        let dest_path = Path::new(&out_dir).join("hello.rs"); 
        let mut f = File::create(&dest_path).unwrap(); 
    
        f.write_all(b" 
         pub fn message() -> &'static str { 
          \"Hello, World!\" 
         } 
        ").unwrap(); 
    } 
    

    、あなたは自動的に前に任意の.rsファイルを生成することができますマクロの衛生上の問題に遭遇したり、夜間のコンパイラに頼らなくてもビルドが開始されます。

    関連する問題