実行時に確定する処理
メソッド呼び出し dict.fromkeys(...) が、どのオブジェクトに対するものかは、実行時に確定します。
object ret = Ops.Call(cls);
...
return ret;
ここでは、どのようにしてリターン値 ret を生成するか(how)は知らなくても、それを使ってなにをしたいか(what)を理解できれば、十分です。実行時に確定した任意のクラス cls のインスタンスが欲しいときに、Ops.Call を利用するだけです。
つまり、Ops.Call(cls) は、cls() と同じことなので、式 dict() が評価されたときの処理をここで実現しているのです。すると、ret は、dict 型のインスタンスになります。
if (ret.GetType() == typeof(Dict)) {
Dict dr = ret as Dict; // 組み込み型 dict
for (int i = 0; i < n; i++) {
dr[xr[i] ] = value;
}
} else {
// slow path, user defined dict
for (int i = 0; i < n; i++) {
Ops.SetIndex(ret, xr[i], value);
}
}
if に続く条件式 ret.GetType() == typeof(Dict) が成立するなら、組み込み型 dict に対するメソッド呼び出し dict.fromkeys(...) と見なします。生成した辞書 dr に、キー xr[i] と値 value を追加します。if に続く条件式が成立しないなら、生成した辞書 ret に、キー xr[i] と値 value を追加する処理を、Ops.SetIndex に委ねます。その詳細(how)については、関連記事で紹介します。
2/3