Не используйте 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);
Ковариация довольно проста и лучше всего подходит для перспектива некоторого коллекционного класса 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
является изменяемым, то ковариация не имеет смысла, потому что мы можем предположить, что наша процедура может добавить какой-то другой фрукт (который не был яблоком), как указано выше. Следовательно, нам нужно только, чтобы неизменяемые классы коллекций были ковариантными!
Вот мои статьи о том, как мы добавили новые функции дисперсии в C # 4.0. Начните снизу.
http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx
У Барта Де Смета есть отличная запись в блоге о ковариации и контравариантности здесь .
Для большего удобства здесь упорядоченный список ссылок на все статьи Эрика Липперта о дисперсии: