Как произносится "=>", как используется в лямбда-выражениях в.Net?

Я очень редко встречаю других программистов!

Моя мысль, когда я впервые увидел токен, была "подразумевает, что", поскольку это то, что он будет читать как математическое доказательство, но это явно не его смысл.

Так как же сказать или прочитать "=>", как в:-

IEnumerable<Person> Adults = people.Where(p => p.Age > 16)

Или есть даже согласованный способ сказать это?

15 ответов

Решение

Я обычно говорю "такой, что" при чтении этого оператора.

В вашем примере p => p.Age > 16 читается как "P, так что p.Age больше 16."

На самом деле, я задал этот вопрос на официальных предварительных форумах linq, и Андерс Хейлсберг ответил, что

Я обычно читаю оператор => как "становится" или "для чего". Например,
Func f = x => x * 2;
Func test = c => c.City == "Лондон";
читается как "x становится x * 2" и "c, для которого c.City равен Лондону"

Что касается "идет" - это никогда не имело смысла для меня. "р" никуда не денется.

В случае чтения кода кому-то, скажем, по телефону, тогда, пока он является программистом на C#, я бы просто использовал слово "лямбда", то есть "p lambda p dot age шестнадцать."

В комментариях Стив Джессоп упомянул "преобразования в" в случае преобразований - так, например, на примере Андерса:

x => x * 2;

будет читать

х отображается в х раз 2.

Это кажется гораздо ближе к реальному замыслу кода, чем "становится" для этого случая.

Из MSDN:

Все лямбда-выражения используют лямбда-оператор =>, который читается как "идет".

Чтение кода по телефону

От Эрика Липперта:

Я лично сказал бы, что c=>c+1 как "видеть, чтобы видеть плюс один". Некоторые варианты, которые я слышал:

Для прогноза (Customer c)=>c.Name: "клиент видит, видит имя точки"

Для предиката (Customer c)=>c.Age > 21: "клиент видит так, что возраст точки больше двадцати одного"

Я всегда называл это "оператор Ван":-)

"р ван возраст р больше 16"

Я видел, как люди говорят: "Стрела".

Я использую "идет", потому что книга LINQ сказала мне:)

Как насчет "карты для"? Это одновременно лаконично и, возможно, более технически точно (т. Е. Нет предположения об изменении состояния, как в случае "идет" или "становится"), нет сопоставления множества с его характеристической функцией, как с "таким, что" или "для которого"), чем другие альтернативы. Хотя, если на странице MSDN уже есть стандарт, возможно, вам следует просто пойти на это (по крайней мере, для кода C#).

"Карты в" - мое предпочтительное произношение. Математически говоря, функция "отображает" свои аргументы на свое возвращаемое значение (можно даже назвать функцию "отображением"), поэтому мне имеет смысл использовать эту терминологию в программировании, особенно в качестве функционального программирования (особенно лямбда-исчисления) очень близко к математике. Он также более нейтрален, чем "становится", "уходит" и т. Д., Поскольку не предполагает смены состояния, как уже упоминалось в контексте.

Помимо получения предыдущей области видимости (все переменные и константы, которые находятся в области видимости для нормальной строки кода в точке, где происходит лямбда-выражение, доступны для кода выражения), лямбда-выражение по сути является синтаксическим сахаром для встроенной функции.

Список значений слева от производственного оператора ("=>") вносит вклад в структуру и содержимое стекового фрейма, используемого для вызова этой функции. Можно сказать, что в список значений входят как объявления параметров, так и передаваемые аргументы; в более традиционном коде они определяют структуру и содержимое кадра стека, используемого для вызова функции.

В результате значения "идут" в коде выражения. Вы бы предпочли сказать "определяет фрейм стека" или "идет к"?:)

В узко определенном применении булевых выражений, используемых в качестве условий фильтра (доминирующее использование лямбда-выражений, широко рассмотренное другими ответами на этот вопрос), очень разумно пропустить метод в пользу намерения кода, и это приводит к " за что "быть таким же кратким и сказать больше о значении кода.

Однако лямбда-выражения не являются единственной провинцией Линка, и вне этого контекста следует использовать более общую форму "идет".


Но почему "уходит"?

Потому что "заполняет кадр стека следующего кода" слишком долго, чтобы продолжать это говорить. Я полагаю, вы могли бы сказать, "это / передано".

Принципиальное различие между явно переданными параметрами и захваченными переменными (если я правильно помню - поправьте меня, если я ошибаюсь) заключается в том, что первые передаются по ссылке, а вторые - по значению.

Если вы представляете лямбда-выражение как анонимный метод, то оно "подходит для" имеет достаточно приличный смысл.

(n => n == String.Empty)

n "идет" к выражению n == String.Empty.

Это относится к анонимному методу, поэтому вам не нужно идти к методу в коде!

Простите за это.

Честно говоря, я не люблю использовать "идет к" в моей голове, но я видел, как другие люди говорили, что это кажется странным, и я подумал, что проясню это.

Мой краткий ответ: "c 'lambda-of' e". Хотя я цепляюсь за "лямбда-с" функцию "е", я думаю, что лямбда-о - это экуменический компромисс. Анализ следует.

Это отличный вопрос хотя бы для причудливых ответов. Большинство переводов имеют иные значения, чем для лямбда-выражений, что приводит к экзотическим интерпретациям. Как старый хакер с лямбда-выражениями, я просто игнорирую нотацию.NET и переписываю ее как лямбда в моей голове, желая, чтобы они сделали для этого почти все остальное.


Для передачи кода по телефону вы хотите, чтобы кто-то мог записать код по порядку. Это, конечно, проблема, но лямбда-стрелка или что-то, возможно, лучшее, что вы можете получить, или, может быть, лямбда-в, но лямбда-в является наиболее точным.

Проблема заключается в использовании инфикса и в том, как назвать всю вещь и роль левой и правой частей чем-то, что работает, когда говорят в месте инфикса.

Это может быть чрезмерно ограниченной проблемой!


Я бы не использовал "такой, что", потому что это означает, что правая часть является предикатом, который должна удовлетворять левая часть. Это очень отличается от разговора о правой стороне, от которой левая сторона была абстрагирована как функциональный параметр. (Заявление MSDN о "всех лямбда-выражениях" является просто оскорбительным и неточным.)

Что-то раздражает в том, что "идет", хотя это может быть как можно ближе. "Идет к" подразумевает преобразование, но нет точно некоторой переменной с, которая идет к выражению в с. Абстракция к функции немного неуловима. Я мог бы привыкнуть к этому, но я все еще жажду чего-то, что подчеркивает абстракцию переменной.

Так как левая часть всегда является простым идентификатором в используемых до сих пор случаях [но ждать расширений, которые могут запутать это позже], я думаю, что для "c => expression" я бы прочитал "c" выражение лямбда-функции. "'или даже" c' arg '' function' expression". В последнем случае я мог бы сказать такие вещи, как "b 'arg' c 'arg' 'function' expression".

Может быть, лучше сделать еще более понятным введение лямбда-выражения и сказать что-то вроде "arg" b "arg" c "function" expression ".

Выяснить, как перевести все это на другие языки, - это упражнение для студента [;<).

Я все еще беспокоюсь о "(b, c) => expression" и других вариантах, которые могут возникнуть, если они этого еще не сделали. Возможно "args" b, c "function" expression ".


После всего этого размышления я замечаю, что перехожу к переводу "c => e" как "lambda" c "function 'e" и замечаю, что отображение на точную форму следует понимать по контексту: λc(e), c => e, f, где f(c) = e и т. д.

Я ожидаю, что объяснение "уходит" будет преобладать просто потому, что именно здесь доминирующее большинство впервые увидит лямбда-выражения. Какая жалость. Хорошим компромиссом может быть "c 'lambda-of' e"

Я не слишком много думал об этом, но просто лаконично говорю "к". Это коротко и кратко, и подразумевает, что переменная передана выражению. Я полагаю, что это может быть перепутано с цифрой 2 ("два"), но я склонен произносить "на" больше как "та" при разговоре. Никто (кто знает лямбды, по крайней мере) никогда не говорил мне, что они думают, что это неоднозначно...

// "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"

В 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; };

=> это просто ярлык, поэтому вам не нужно использовать ключевое слово делегата и включать информацию о типе, так как он может быть выведен компилятором.

Мой термин для => применительно к показанным примерам результат

'result = s => s.Age > 12 && s.Age < 20'

s, где s. возраст больше 12 и s. возраст менее 20

'result = x => x * 2'

x, где x умножается на 2

'result = c => c.City == "London"'

c, где c.city эквивалентно "Лондону"

'result = n => n == String.Empty'

n, где n - пустая строка

Другие вопросы по тегам