Интервью: Что такое выражение Лямбды?
Недавно у меня было два телефонных интервью.
В обоих интервью меня спросили как последний вопрос определить выражение Лямбды.
Я утверждал, что выражение Lambda является неназванным методом вместо делегата.
Но этого было недостаточно.
Мне очень сложно объяснить это именно в телефонном интервью.
Кто-нибудь знает лучше?
Ответы
Ответ 1
Лямбда-выражения - это безымянные функции, заданные как постоянные значения. Они могут появляться в любом месте любой другой константы, но обычно записываются как параметр для какой-либо другой функции. Канонический пример состоит в том, что вы передадите функцию сравнения в общую подпрограмму "сортировка", и вместо того, чтобы затруднять определение целой функции (и нести лексическое разрывы и пространство имен), чтобы описать это сравнение, вы можете просто передать lambda выражение, описывающее сравнение.
ОДНАКО, это пропустит одну из самых важных особенностей Lambda Expressions, которая заключается в том, что они выполняются в контексте их внешнего вида. Поэтому они могут использовать значения переменных, которые определены в этом контексте. Это отличает функциональные указатели от истинных лямбда-выражений. В языках, поддерживающих изменяемые переменные, правильные лямбда-выражения дают возможность изменять значения этих переменных.
Лямбда-выражения появляются (с различным синтаксисом) во всех LISP, Perl, Python и достаточно последних версиях С++, Objective C, С# и Java 8, но особенно не в C, хотя у него есть способ справиться с передачей функции (или некоторое оправдание для них) вокруг как параметры. Они представляют собой синтаксический элемент с определенной семантикой, и эти семантики предъявляют больше требований к времени выполнения, чем требуется для C.
Ответ 2
Лямбда-выражение представляет собой безымянную приостановку кода.
Рассмотрим эту анонимную функцию "умножить две вещи" (выражение a.k.a. лямбда), используя некоторые очень неспецифические обозначения.
λ(x, y) -> x * y
Ваш ответ был очень специфичным для места, где вы использовали лямбда (я угадываю С#?), и я подозреваю, что интервьюер просил более общего понимания. Концепция делегата, язык С# и идея метода являются второстепенными по отношению к тому, что такое лямбда и как они работают. Вы можете вычислить, используя lambda-выражения на бумаге, например, без каких-либо методов.
Ответ 3
Возможно, они просто хотели услышать, что LINQ был "Language-Integrated Query".
Говоря, что если они действительно хотят объяснить "что" LINQ, я бы, вероятно, включил дополнительную информацию, которую вы предоставили. Что-то вроде:
LINQ или Language-Integrated Query - набор языковых добавлений и классов инфраструктуры, добавленных в .NET 3.5, которые позволяют более функциональный подход к операциям запроса. Он основан на методах расширения для IEnumerable и IQueryable и их общих аналогов, которые позволяют отсроченное выполнение в LINQ для объектов и удаленную обработку через IQueryable, а также многие другие функции. Были также внесены изменения языка в С# и VB.NET для поддержки более "естественного" синтаксиса запроса непосредственно на языке.
Ответ 4
Хорошо, я сказал, что Linq является неназванным методом вместо делегата.
Собственно, это не LINQ вообще, а "лямбда-выражение". И технически LINQ даже не использует их.
LINQ означает "Language Integrated Query". В частности, это "от... где.. выберите" ключевые слова (т.е. Синтаксис запроса, который интегрирован в язык).
Теперь, чтобы заставить это ключевое слово делать что-то, на язык (и CLR) добавлено гораздо больше (например, lambdas, методы расширения, класс Enumerable и т.д.).
Ответ 5
Чтобы ответить на ваш пересмотренный вопрос, для этого вы отвечаете на самом деле хорошо. Единственное изменение, которое я сделаю, это подчеркнуть слово "inline".
Выражение Lambda - это неназванный метод, который написан inline на месте где требуется делегат.
Ответ 6
Вы должны посмотреть Lambda Expression в msdn
Ответ 7
Вероятно, они хотят узнать, что LINQ - это новый DSL для запросов объектов IQueryable
и IEnumerable
. Синтаксис "from... where... select..." по существу. Знание того, что оно реализовано под обложками с lambdas и функциональным стилем, вероятно, принесет вам бонусные очки.