万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    UnityScript eval使える

    上記の本とかで、eval() is "evil"(eval()は悪)とか言われるが、
    UnityScriptもJavaScriptを謳ってるし、ActionScriptにも似てるから調べた。

    あった。
    URL: http://answers.unity3d.com/questions/7885/interpret-unityscript-at-runtime.html

    書いてみた。

        var str : String = "Debug.Log(\"hoge\")";
        eval(str);
    

    hoge のログが出力された

    C#でも”似たこと”はできるけど、eval()というメソッドではない
    URL: http://d.hatena.ne.jp/nyanp/20120319/p1

    eval多用したら読みにくそうだけど、いろいろおもしろいことも出来そう。

    クラス定義して、

    class Hoge
    {
        function Bar()
        {
            Debug.Log("hello");
        }
    }
    

    こうしたら"hello"が出力されてた。

        var hoge:Hoge = new eval("Hoge()");
        hoge.Bar();
    

    どのクラスからインスタンス化されたかも実験できる

    まずこんな書き方は出来なかった
    ×

        var classStrArr : String = ["Hoge", "Bar"];
    
        if (fuga instanceof eval(classStrArr[0]))
        {
        }
    

    instanceofも含むすべての文字列をevalで解釈させて、
    その返り値で判定すると動作した

        var bool:boolean = eval("fuga instanceof " + classStrArr[0]);
        if (bool)
        {
        }


    さらに、

    クラス定義して

    class Fuga extends Hoge
    {
        function Save()
        {
            Debug.Log("hello");
        }
    
        virtual function GetStr(str:String)
        {
            return str + " from Fuga";
        }
    }
    
    class Hoge
    {
        virtual function Bar()
        {
            Debug.Log("hello");
        }
    
        virtual function GetStr(str:String):String
        {
            return str + " from Hoge";
        }
    }

    こんな使い方も可能

        var typeArr:String[] = ["Hoge", "Fuga"];
        var hoge:Hoge = new Fuga();
    
        var bool:boolean = eval("hoge instanceof " + typeArr[1]);
        var hoge2 : Hoge;
    
        if (bool)
        {
            Debug.Log(1);
            hoge2 = new eval(typeArr[1] + "()" );
            // ↓「Debug.Log((hoge2 as Fuga).GetStr("str"));」のつもり
            Debug.Log(eval("(hoge2 as " + typeArr[1] + ").GetStr(\"str\")"));
        }
    

    出力

    str from Fuga