UWSC v5.0.0 FOR-IN構文について
FOR-IN構文、便利ですよね!
シンタックスシュガーだと思うけど、馬鹿にはならないのです。
C#使ってると、シンタックスシュガーって意外と大事、と思います。
ということで、FOR-INで遊んでみた。
二重ループとか、GetOleItemとぶつかったりするんじゃないかなー、と。
追記 2014/06/12
この問題は、v5.0.1で解決されました。
現在は問題ありません。
追記 2014/05/28
間違いを修正。
独立オブジェクトの例がイマイチだったので、それも修正。
エラー時、中身をPRINTする。
結論としては、
- COMオブジェクトに対するFOR-INはGetOleItemと等価。
- すなわち、FOR-INの二重やFOR-INとGetOleItemの併用は不可。
私が何か間違えてなければ。
確認スクリプト
OPTION EXPLICIT DIM n, s, ns, p = "1234567890" WITH CreateOleObj("VBScript.RegExp") .Pattern = "(\d)(\d)(\d)" .Global = True PRINT PRINT "FOR-TO + FOR-TO" ns = .Execute(p) FOR n = 0 TO ns.Count - 1 FOR s = 0 TO ns.Item(n).SubMatches.Count - 1 PRINT ns.Item(n).Value + " " + ns.Item(n).SubMatches.Item(s) NEXT NEXT PRINT PRINT "FOR-TO + FOR-IN" ns = .Execute(p) FOR n = 0 TO ns.Count - 1 FOR s IN ns.Item(n).SubMatches PRINT ns.Item(n).Value + " " + s NEXT NEXT PRINT PRINT "FOR-TO + GETOLEITEM" ns = .Execute(p) FOR n = 0 TO ns.Count - 1 FOR s = 0 TO GETOLEITEM(ns.Item(n).SubMatches) - 1 PRINT ns.Item(n).Value + " " + ALL_OLE_ITEM[s] NEXT NEXT PRINT PRINT "FOR-IN + FOR-TO" FOR n IN .Execute(p) FOR s = 0 TO n.SubMatches.Count - 1 PRINT n.Value + " " + n.SubMatches.Item(s) NEXT NEXT PRINT PRINT "GETOLEITEM + FOR-TO" FOR n = 0 TO GETOLEITEM(.Execute(p)) - 1 FOR s = 0 TO ALL_OLE_ITEM[n].SubMatches.Count - 1 PRINT ALL_OLE_ITEM[n].Value + " " + ALL_OLE_ITEM[n].SubMatches.Item(s) NEXT NEXT // ng PRINT PRINT "FOR-IN + FOR-IN" TRY FOR n IN .Execute(p) FOR s IN n.SubMatches PRINT n.Value + " " + s NEXT NEXT EXCEPT PRINT TRY_ERRLINE + " " + TRY_ERRMSG PRINT VarType(n) + ":" + n // 「2」 sの二番目 ENDTRY PRINT PRINT "FOR-IN + GETOLEITEM" TRY FOR n IN .Execute(p) FOR s = 0 TO GETOLEITEM(n.SubMatches) - 1 PRINT n.Value + " " + ALL_OLE_ITEM[s] NEXT NEXT EXCEPT PRINT TRY_ERRLINE + " " + TRY_ERRMSG PRINT VarType(n) + ":" + n // 「2」 sの二番目 ENDTRY PRINT PRINT "GETOLEITEM + FOR-IN エラーにはならないけど結果が期待値と異なる" FOR n = 0 TO GETOLEITEM(.Execute(p)) - 1 FOR s IN ALL_OLE_ITEM[n].SubMatches PRINT ALL_OLE_ITEM[n].Value + " " + s NEXT NEXT PRINT PRINT "FOR-IN + FOR-IN オブジェクト独立も無理か。一方がCOMでなければもちろんOK" DIM sc = CreateOleObj("ScriptControl") sc.Language = "JScript" ns = sc.Eval("['a','b','c','d']") TRY FOR n IN .Execute(p) FOR s IN ns PRINT n.Value + " " + s NEXT NEXT EXCEPT PRINT TRY_ERRLINE + " " + TRY_ERRMSG PRINT VarType(n) + ":" + n // 「b」 sの二番目 ENDTRY ENDWITH
エラーがなんか、なんでだろーって感じ。
stuncloudさん、コメントで指摘、ありがとうございます。