Ковариантность и контравариантность на языках программирования

Не используйте eval, если у вас абсолютно, положительно нет другого выбора.

Как уже упоминалось, использование чего-то подобного было бы лучшим способом сделать это:

window["functionName"](arguments);

Это, однако, не будет работать с функцией пространства имен:

window["My.Namespace.functionName"](arguments); // fail

Вот как вы это сделаете:

window["My"]["Namespace"]["functionName"](arguments); // succeeds

Чтобы упростить это и обеспечить некоторую гибкость, вот удобная функция:

function executeFunctionByName(functionName, context /*, args */) {
  var args = Array.prototype.slice.call(arguments, 2);
  var namespaces = functionName.split(".");
  var func = namespaces.pop();
  for(var i = 0; i < namespaces.length; i++) {
    context = context[namespaces[i]];
  }
  return context[func].apply(context, args);
}

Вы бы назвали это вот так:

executeFunctionByName("My.Namespace.functionName", window, arguments);

Обратите внимание, вы можете передать в любом контексте, который вы хотите, так что это будет делать то же, что и выше:

executeFunctionByName("Namespace.functionName", My, arguments);
20
задан oxbow_lakes 22 July 2009 в 07:02
поделиться

5 ответов

Ковариация довольно проста и лучше всего подходит для перспектива некоторого коллекционного класса List . Мы можем параметризовать класс List с помощью некоторого параметра типа T . То есть наш список содержит элементы типа T для некоторого T . Список будет ковариантным, если

S является подтипом T iff List [S] является подтипом List [T]

(где я использую математическое определение iff для обозначения ] тогда и только тогда, когда .)

То есть List [Apple] является List [Fruit] . Если есть какая-то подпрограмма, которая принимает List [Fruit] в качестве параметра, а у меня есть List [Apple] , то я могу передать это как допустимый параметр.

def something(l: List[Fruit]) {
    l.add(new Pear())
}

Если наш класс коллекции List является изменяемым, то ковариация не имеет смысла, потому что мы можем предположить, что наша процедура может добавить какой-то другой фрукт (который не был яблоком), как указано выше. Следовательно, нам нужно только, чтобы неизменяемые классы коллекций были ковариантными!

18
ответ дан 29 November 2019 в 23:14
поделиться

Вот мои статьи о том, как мы добавили новые функции дисперсии в C # 4.0. Начните снизу.

http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx

7
ответ дан 29 November 2019 в 23:14
поделиться

У Барта Де Смета есть отличная запись в блоге о ковариации и контравариантности здесь .

0
ответ дан 29 November 2019 в 23:14
поделиться

Для большего удобства здесь упорядоченный список ссылок на все статьи Эрика Липперта о дисперсии:

  1. Ковариация и контравариантность в C #, часть первая
  2. Ковариация и контравариантность в C #, часть вторая: ковариация массива
  3. Ковариация и контравариантность в C #, часть третья: дисперсия преобразования группы методов
  4. Ковариация и контравариантность в C #, часть четвертая: дисперсия реального делегата
  5. Ковариация и Контравариантность в C #, часть пятая: функции высшего порядка травмируют мой мозг
  6. Ковариация и контравариантность в C #, часть шестая: вариативность интерфейса
  7. Ковариация и контравариантность в C #, часть седьмая: зачем нам вообще нужен синтаксис?
  8. Ковариация и контравариантность в C #, часть восьмая: параметры синтаксиса
  9. Ковариация и контравариантность в C #, часть девятая: важные изменения
  10. Ковариация и контравариантность в C #, часть десятая: работа с неоднозначностью
5
ответ дан 29 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: