ソースコードの歩き方《IronPython》map 4/5

Previous|4/5|Next
Python.use(better, src=”IronPython”) # ソースコードを散策する記事一覧

引数が3つ以上の場合:複数のシーケンス

複数のシーケンスを指定した場合を考察します。else ブロックの直後には、次のコードの断片があります。

    IEnumerator[] enums = new IEnumerator[param.Length - 1];
for (int i = 0; i < enums.Length; i++) {
enums[i] = Ops.GetEnumerator(param[i + 1]);
}

変数 enums は、指定されたシーケンスと同数の配列 IEnumerator[] を保持します。配列 enums の各要素には、シーケンスごとに各要素を順に参照するための IEnumerator を保持します。

    object[] args = new object[enums.Length];

変数 args は、指定されたシーケンスと同数の配列 object[] を、作業領域として保持します。

テストケースを使って

具体的なテストケースで説明すると、より理解が深まります。

>>> map(lambda a,b,c: a+b+c, "AB", "12", "xy")
['A1x', 'B2y']

lambda 関数には、シーケンスと同数の引数 a,b,c が必要です。各シーケンスの要素(文字)を順に参照して、それらを連結した文字列を列挙したリストが得られます。


まず、各シーケンスから要素(文字)を1つずつ取り出して、これら "A"+"1"+"x" を連結した文字列 "A1x" を生成します。このとき、配列 args は、各要素を順に保持します。そして、各 enums は、未処理の要素が残っているので、次へと進みます。


[f:id:kotsubu-chan:20080901134122p:image]

次に、各シーケンスから要素(文字)を1つずつ取り出して、これら "B"+"2"+"y" を連結した文字列 "B2y" を生成します。このとき、配列 args は(新たに確保した作業領域に)各要素を順に保持します。そして、各 enums は、未処理の要素が残っていないので、次には進めません。


Previous|4/5|Next