Это зависит от того, как точный Вы хотите, чтобы сравнение было. Если Вы хотите выдержать сравнение для точно того же числа, то просто идут с ==. (Вы почти никогда не хотите сделать это, если Вы на самом деле не хотите точно то же число.) На любой достойной платформе можно также сделать следующее:
diff= a - b; return fabs(diff)<EPSILON;
как fabs
имеет тенденцию быть довольно быстрым. Довольно быстрым я подразумеваю, что это - в основном поразрядное И, таким образом, это лучше быть быстрым.
И целочисленные приемы для сравнения удваивается, и плавания хороши, но имеют тенденцию делать более трудным для различных конвейеров ЦП обработать эффективно. И это находится определенно не быстрее на определенном, чтобы архитектура в эти дни из-за использования стека как область временного хранения для значений, которые используются часто. (Хранилище хита загрузки для тех, кто заботится.)
Проще говоря, лямбда - это функция без имени или анонимная функция. Небольшой фрагмент исполняемого кода, который можно передавать, как если бы он был переменной. В JavaScript:
function () {}; // very simple
Давайте теперь посмотрим, как можно использовать эти лямбды.
Лямбда-выражения могут использоваться для абстрагирования шаблонного кода. Например петли. Мы привыкли писать для
и , а
циклически повторяются в течение всего дня. Но это код, который не пишется. Мы могли бы извлечь код внутри цикла, наиболее важной части цикла, и абстрагироваться от остального:
for (var i=0; i<array.length; i++) {
// do what something useful with array[i]
}
с помощью forEach
объектов массива становится:
array.forEach(function (element, index) {
// do something useful with element
// element is the equivalent of array[i] from above
});
Приведенная выше абстракция не может Будь это полезно, но есть и другие функции более высокого порядка, такие как forEach
, которые выполняют гораздо более полезные задачи. Например, filter
:
var numbers = [1, 2, 3, 4];
var even = [];
// keep all even numbers from above array
for (var i=0; i<numbers.length; i++) {
if (numbers[i] % 2 === 0) {
even.push(numbers[i]);
}
}
alert(even);
// Using the filter method
even = [1, 2, 3, 4].filter(function (number) {
return number % 2 === 0;
});
alert(even);
В некоторых средах, в которых доступна концепция события, мы могли бы использовать лямбда-выражения для ответа на события, которые могут произойти в определенный момент времени.
window.onload = function () {
alert("Loaded");
};
window.setTimeout(function () {
alert("Code executed after 2 seconds.");
}, 2000);
Это можно было сделать другими способами, но они довольно многословны. Например, в Java есть интерфейс Runnable
.
До этого момента мы в основном использовали лямбды только для их синтаксических возможностей сахара. Но бывают ситуации, когда лямбды могут быть намного полезнее. Например, у нас могут быть функции, возвращающие лямбды. Допустим, у нас есть функция, возвращаемые значения которой должны быть кэшированы.
var users = [];
var getUser = function (name) {
if (! users[name]) {
// expensive operations to get a user. Ajax for example
users[name] = user_from_ajax;
}
return users[name];
};
Позже мы можем заметить, что у нас есть похожая функция:
var photos = [];
var getPhoto = function (name) {
if (! photo[name]) {
// expensive operations to get a user. Ajax for example
photos[name] = photo_from_ajax;
}
return photos[name];
};
Там явно есть шаблон, поэтому давайте абстрагируемся от него. Давайте использовать мемоизацию .
/**
* @param {Array} store Data structure in which we cache lambda's return values
* @param {Function} lambda
* @return {Function} A function that caches the result of calling the lambda param
*/
var memoize = function (store, lambda) {
// return a new lambda
return function (name) {
if (! store[name]) {
// Execute the lambda and cache the result
store[name] = lambda(name);
}
return store[name];
};
};
var getUsers = memoize([], function (name) {
// expensive operations to get a user. Ajax for example
});
var getPhotos = memoize([], function (name) {
// expensive operations to get a photo. Ajax for example
});
Как видите, с помощью лямбда-выражений мы смогли абстрагироваться от логики кеширования / мемоизации. Если бы для другого примера были некоторые обходные пути, Я считаю, что эту проблему вряд ли можно решить другими методами. Нам удалось собрать важный шаблонный код в одном месте. Не говоря уже о том, что мы избавились от глобальных переменных пользователей
и фотографий
.
Глядя на ваш профиль, я вижу, что вы в основном пользователь Python. Для вышеприведенного шаблона в Python есть концепция декораторов. В сети есть множество примеров для декораторов мемоизации . Единственное отличие состоит в том, что в Python у вас, скорее всего, есть вложенная функция с именем внутри этой функции-декоратора. Причина в том, что Python поддерживает только лямбды с одним выражением. Но концепция та же.
В качестве примера использования лямбда-выражения Python. Приведенный выше код, в котором мы отфильтровали четные числа, может быть представлен в Python следующим образом:
filter(lambda x: x % 2 == 0, [1, 2, 3, 4])
В любом случае, лямбды не так эффективны без замыканий. Замыкания - вот что делает концепцию лямбда настолько мощной. В моем примере с мемоизацией я использовал замыкания для создания замыкания вокруг параметра store
. Таким образом, у меня есть доступ к этому параметру даже после того, как функция memoize
вернула свой результат (лямбда).
Термин «лямбда» используется для обозначения анонимной функции, обычно замыкания . Они полезны, потому что позволяют писать функции, использующие другие функции, без ненужного раздувания кода. Например, в Ruby:
(1..100).select {|num| num % 2 == 0}
Это создаст массив, содержащий четные числа от 1 до 100. Нам не нужно писать явный цикл - метод select принимает функцию, которую он использует для проверки значений, поэтому все, что нам нужно, это наша собственная логика. Это позволяет нам значительно настраивать метод практически без усилий и накладных расходов. По сути, мы можем составлять функции из более мелких функций.
Это простой пример того, что они могут делать.
Лямбды в .NET довольно часто называют «синтаксическим сахаром». Они не влияют напрямую на функциональность, но упрощают использование языка людьми.
Когда вы поймете силу их использования, я уверен, вы обнаружите, что будете писать меньше кода по сравнению со старым способом, использующим делегаты / анонимные методы.
«Лямбда» может быть слишком мало. Взгляните на Лямбда-исчисление . Это полезно в функциональном программировании.
А функциональное программирование - это еще одна парадигма программирования (например, процедурная или объектно-ориентированная).
Если вы используете Java , вы много слышали о лямбдах или замыканиях за последние пару месяцев, потому что были разные предложения по добавлению этой функции в Java 7. однако я думаю, что комитет отказался от нее. Одно из предложений было сделано Нилом Гафтером и подробно описано здесь: javac.info .
Было бы круче, если бы вы использовали закрытый ключ для подписи элемента
Открытый ключ, необходимый для проверки подпись будет общеизвестной.
Пояснение
Подпись вашего кода защитит его только от изменений, он не будет скрывать какую-либо информацию в нем. В вашем исходном вопросе упоминается шифрование, но я не уверен, что это требование - скрыть данные или просто защитить их от модификации.
Пример кода: (Никогда не публиковать PrivateKey.key. ServerMethods необходимы только при подписании файла xml , лямбда-выражения используются, когда в месте вызова необходимы небольшие и не слишком сложные функции. Если бы функция была нетривиальной, вам нужно было бы не лямбда-выражение, а обычную функцию или функциональный объект ».
Также может оказаться полезным взять и прочитать исходный код компилятору. Я сомневаюсь, что GCC - лучший выбор, так как он обременен полной совместимостью с более чем 20-летним развитием языка. Но я также уверен, что чтение его источника, руководствуясь одним из внутренних справочных руководств, будет полезным.
Я бы серьезно подумал о том, чтобы посмотреть на исходный текст языка сценариев, который внутренне компилируется в байт-код для виртуальная машина. Под это описание подходят несколько языков, но я бы начал с Lua . Язык небольшой, а виртуальная машина - новая. Исходный код также невелик, и фрагменты, на которые я смотрел, были очень четкими, хотя и слегка прокомментированы.
Лямбда-выражение x => x * x читается как «x переходит в x, умноженное на x».из MSDN
Полное объяснение лямбда-выражений можно найти также в Википедии . (Прокрутите вниз до раздела Лямбда-исчисление и языки программирования .) Лямбда-выражения не новы, и они не просто часть C #, а то, что было введено в вычисления почти 80 лет назад! Лямбда-выражения - основа функционального программирования.
Это ценность? Что ж, учитывая, что он на самом деле довольно старый, я бы сказал: очень ценен для любого, кто делает вычисления.
Здесь вы найдете все, что вам нужно знать (о лямбдах C #) для начала:
Лямбда-выражения
Если вы когда-либо работали с функциями / методами, которые используют указатели функций, делегаты, стратегию или шаблон наблюдателя / обработку событий, и думали про себя: «Я пишу всю эту функцию, чтобы использовать это только один раз - чтобы передать его этому методу; я хотел бы просто написать его на месте, а не загромождать свой код »- вот где вы можете использовать Lambda-функции. Языки, поддерживающие эту конструкцию, также обычно в значительной степени используют преимущества концепции передачи функций в качестве параметров, особенно в отношении работы со списками (функции первого класса и функции высшего порядка). Это особенно верно для функциональных языков, которые для вычислений полагаются на композицию функций, а не на изменение памяти. В некоторых случаях (в таких языках, как Python),
Да, это просто способ втиснуть множество строк кода в одно выражение. Но, будучи настолько эффективным, он позволяет по-новому структурировать вашу программу.
Часто можно избежать написания делегатов или обратных вызовов и вернуться к процедурному стилю просто потому, что объявлять новые функции или классы для одного выражения слишком много.
Лямбда-выражения делают целесообразным использование обратных вызовов даже для самых крошечных задач, что может сделать код более понятным. Может и нет.
«лямбда» как слово - это терминология тех времен, когда люди, занимающиеся компьютерными науками, могли обучаться математике или логике с большей вероятностью, чем иметь степень в области компьютерных наук. Некоторые из них придумали парадигму под названием «функциональное программирование», весьма отличную от императивного и весьма мощную. AFAIK , это среда, в которой этот термин вошел в употребление.
Математики и логики склонны использовать странные слова.
«лямбда» звучит действительно эзотерически - как если бы они были очень странной и особенной вещью. На самом деле, если вы пишете JavaScript для приложения веб-браузера и используете идиому "var foo = function () {...}", вы всегда использовали лямбда-функции.