上記の本とかで、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