Как произносится"=>", как используется в лямбда-выражениях in.Net
Я очень редко встречаю других программистов!
Итак, как я могу сказать или прочитать"=>", как в: -
IEnumerable<Person> Adults = people.Where(p => p.Age > 16)
или есть даже согласованный способ сказать это?
15 ответов
Я обычно говорю "такое, что" при чтении этого оператора.
в вашем примере p => p.Возраст > 16 читается как " P, такой, что p.Возраст старше 16 лет."
на самом деле, я задал этот самый вопрос на официальных форумах LINQ pre-release, и Андерс Хейлсберг ответил, сказав
Я обычно читаю оператор => как "будет" или "для чего". Например,
Func f = x => x * 2;
Тест Функ = с => В. Город == "Лондон";
гласит "x становится x * 2" и " c, для которого c.Город равен Лондону"
что касается "идет к" - это никогда не имело смысла для меня. "п" никуда не денется.
в комментариях Стив Джессоп упомянул "карты" в случае преобразований-так что Андерс" пример:
x => x * 2;
читал
X отображает x раз 2.
это кажется гораздо ближе к фактическому намерению кода, чем "становится" для этого случая.
с MSDN:
все лямбда-выражения лямбда оператор =>, который читается как "идет к."
От Эрика Липперта:
Я лично сказал бы c=>c+1 Как "см. Идет, чтобы увидеть плюс один". Некоторые вариации, которые я слышал:
для проекции, (клиент c)=>c.Имя: "клиент видит становится видеть имя точки"
для предиката (клиент c)=>c.Возраст > 21: "клиент видит такое, что видит возраст точки больше, чем двадцать один"
Как насчет "карты"? Это и лаконично, и, возможно, более технически точно (т. е. нет предположения об изменении состояния, как с "идет" или "становится", нет слияния множества с его характеристической функцией, как с "таким, что" или "для которого"), чем другие альтернативы. Хотя, если уже есть стандарт, как показывает страница MSDN, возможно, вам следует просто пойти с этим (по крайней мере, для кода C#).
"Maps to" - мое предпочтительное произношение. Математически говоря, функция "сопоставляет" свои аргументы с возвращаемым значением (можно даже назвать функцию "отображением"), поэтому мне имеет смысл использовать эту терминологию в программировании, особенно поскольку функциональное программирование (особенно лямбда-исчисление) очень близко к математике. Он также более нейтрален, чем "становится", "идет" и т. д., так как это не предполагает изменения состояния, как упоминалось contextfree.
Я не думал об этом много, но я просто кратко говорю "к". Он короткий и сжатый и подразумевает, что переменная передается to выражение. Я полагаю, что его можно спутать с цифрой 2 ("два"), но я склонен произносить" to "больше похоже на" ta", когда говорю. Никто (кто знает лямбду, по крайней мере) никогда не говорил мне, что они считают это двусмысленным...
// "Func f equals x to x times two"
Func f = x=> x * 2;
// "Func test equals c to c dot City equals London"
Func test = c => c.City == "London"
мой короткий ответ:"c 'lambda-of' e". Хотя я цепляюсь за" лямбда " C "функция e", я думаю, что лямбда-это экуменический компромисс. Далее следует анализ.
Это отличный вопрос, если только для причудливых ответов. Большинство переводов имеют другие значения, чем для лямбда-выражений, что приводит к экзотическим интерпретациям. Как старый хакер лямбда-выражения, я просто игнорирую нотацию .NET и переписываю ее как лямбда в своей голове, желая, чтобы они сделали почти что-нибудь еще для этого.
для повествования кода по телефону, вы хотите, чтобы кто-то мог записать код в последовательности. Это, конечно, проблема, но лямбда-стрелка или что-то еще, вероятно, лучшее, что вы можете получить, или, может быть, лямбда-В, но лямбда-Из является наиболее точным.
проблема заключается в использовании инфикса и как назвать все это и роль левой и правой частей с чем-то, что работает, когда говорят в инфиксе место.
Это может быть чрезмерно ограниченная проблема!
Я бы не использовал "такое, что", потому что это означает, что правая сторона является предикатом, который левая сторона должна удовлетворять. Это очень отличается от разговора о правой стороне, из которой левая сторона абстрагирована как функциональный параметр. (Утверждение MSDN о "всех лямбда-выражениях" просто оскорбительно, а также неточно.)
Что-то раздражает "идет", хотя это может быть так близко, как мы можем сделать. "Идет к" подразумевает преобразование, но нет точно какой-то переменной c, которая идет к выражению в c. Абстракция функции несколько неуловима. Я мог бы привыкнуть к этому, но я все еще жажду чего-то, что подчеркивает абстракцию переменной.
поскольку левая сторона всегда является простым идентификатором в случаях, используемых до сих пор [но дождитесь расширений, которые могут запутать это позже], я думаю, для "c => expression" я бы прочитал "c' Lambda-function ' expression "или даже"c 'arg' 'function' expression". В последнем случае я мог бы сказать такие вещи, как"B' arg 'c' arg '' function 'expression".
возможно, было бы лучше сделать еще более ясным, что вводится лямбда-выражение и сказать что-то вроде "'arg' b 'arg' c 'function' expression".
выяснить, как перевести все это на другие языки-это упражнение для студента [;
Я все еще беспокоюсь о" (b, c) => expression " и других вариантах, которые могут возникнуть, если они еще не появились. Возможно, выражение"' args 'b, c' function'".
после всех этих размышлений я замечаю, что я прихожу к переводу "c => e" как "лямбда" C "функция" e " и замечаю, что отображение в точную форму должно пониматься контекстом: λc(e), c => e, f здесь f (c) = e и т. д.
Я ожидаю, что "идет-" объяснение будет преобладать просто потому, что именно здесь доминирующее большинство впервые увидит лямбда-выражения. Какая жалость. Хорошим компромиссом может быть "с 'лямда-о 'e"
Если вы представляете лямбда-выражение как анонимный метод, "идет" имеет достаточно приличный смысл.
(n => n == String.Empty)
n "переходит к" выражению N == String.Пустой.
он переходит к анонимному методу, поэтому вам не нужно переходить к методу в коде!
извиняюсь за это.
помимо получения предыдущей области (все переменные и константы, которые находятся в области для нормальной строки кода в точке, где происходит лямбда-выражение, доступны для кода выражения) лямбда-выражение по существу является синтаксическим сахаром для встроенной функции.
список значений слева от производственного оператора ( "= > " ) вносит структуру и содержимое кадра стека, используемого для вызова этой функции. Можно сказать, что список значения вносит как объявления параметров, так и аргументы, которые передаются; в более обычном коде они определяют структуру и содержимое фрейма стека, используемого для вызова функции.
в результате значения "перейти к" коду выражения. Вы бы предпочли сказать "определяет кадр стека для "или" идет к"? :)
в узко определенном применении булевых выражений, используемых в качестве условий фильтра (доминирующее использование лямбда-выражений широко рассмотренный другими ответами на этот вопрос), очень разумно пропустить метод в пользу намерения кода, и это приводит к тому, что "для которого" является столь же кратким и говорит больше о значении кода.
однако лямбда-выражения не являются единственной областью Linq, и вне этого контекста следует использовать более общую форму "идет к".
но почему "идет" ?
потому что " заполняет кадр стека следующий код " слишком длинный, чтобы продолжать говорить об этом. Я полагаю, вы могли бы сказать, "не передают".
решающее различие между явно переданными параметрами и захваченными переменными (если я правильно помню - исправьте меня, если я ошибаюсь) заключается в том, что первые передаются по ссылке, а последние по значению.
часть проблемы заключается в том, что вы можете прочитать его вслух по-разному в зависимости от того, как она структурирована. Жаль, что это не так красиво или интегрировано, как ruby's/.
в Ruby этот же sybmol называется "hashrocket", и я слышал, что программисты C# тоже используют этот термин (хотя это неправильно).
мои две копейки:
s => s.Age > 12 && s.Age < 20
" лямбда-выражение с параметром s равно { return s.Age > 12 && s.Age < 20;
}"
мне нравится это, потому что это напоминает мне, откуда происходит выражение lamdba
delegate(Student s) { return s.Age > 12 && s.Age < 20; };
=> - это просто ярлык, поэтому вам не нужно использовать ключевое слово delegate и включать информацию о типе, поскольку она может быть выведена компилятором.