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さん、コメントで指摘、ありがとうございます。