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

160

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

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

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

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

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

Кристофер Эдвардс
источник
6
120 голосов «за» довольно примечательны для закрытого вопроса.
дата
Я всегда склонен произносить это «подразумевает» как один и тот же оператор в логике.
IllidanS4 хочет вернуть Монику

Ответы:

149

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

В вашем примере 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-than шестнадцать."

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

x => x * 2;

будет читать

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

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

Эрик Форбс
источник
1
Это верно только тогда, когда лямбда-фильтр используется в качестве фильтра.
Андру Лувизи
4
«Goes to» - менее неловкий рендеринг «заполняет кадр стека»
Питер Воне
1
Мне действительно не нравится "х становится х * 2"; х является входом и остается неизменным во всем. Такое прочтение звучит как операция присваивания.
Герман
@ Питер - очень верно. =) @ Герман - Я склонен согласиться, хотя я не могу придумать лучшего примера для преобразований. Может быть «превращается в»?
Эрик Форбс
5
Я бы сказал, "карты для" в этом случае. Существует небольшой риск того, что люди подумают, что вы говорите о контейнере, но вы можете прояснить это, объяснив при первом произнесении этого слова, что вы имеете в виду «лямбда-оператор, вы знаете, равно-знак-больше-больше». чем».
Стив Джессоп
56

Из MSDN :

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

Кент Бугаарт
источник
7
Межжала. Возможно, более интересно то, что это было верно для версии VS2010 , но руководство было удалено из версии VS2012 .
Блэр Конрад
@BlairConrad - возможно, это правда, когда вы написали свой комментарий, но теперь он доступен для всех текущих версий VS.
cp.engr
Я больше не вижу слова "идет в" в документации MSDN, связанной в ответе выше. Я помню, примерно в 2010 году наставник говорил мне, что лямбда-функция должна читаться как «идет», и я всегда так ее читал. Однако наткнуться на этот вопрос, читая его как «такой, который» имеет больше смысла для меня.
matt.fc
18

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

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

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

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

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

Гульзар Назим
источник
«Goes to» - это фраза, которую я больше всего слышал, работая над командами LINQ.
DamienG
15

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

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

Айдос
источник
10
Это Numberwang!
comichael
4
Ты должен сказать мне, где еще на планете кто-то называет это "Ван". У меня был член команды, который сказал мне, что это был «Ван», и единственное место в интернете, которое любой из нас может найти, это ответ.
Кристофер
1
@Wartickler Я из Западной Австралии - всегда называл это оператором Ванга :-)
Aidos
7

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

Брайан
источник
6
Я надеюсь, что это шутка.
Джейкоб Карпентер
Это не так - я видел то же самое.
Эрик Форбс
1
Я думаю, что люди, которые говорят «стрела», имеют в виду это: ->
Dour High Arch
6
Я никогда не видел этого. Слышал, может быть, но не видел.
ctacke
Стрелка кажется мне разумной, поскольку она должна представлять знак стрелки из лямбда-исчисления. Я слышал, что академические типы называют это стрелкой или стрелкой вправо, я видел код на Haskell на латексных слайдах с оператором ->, замененным на символ стрелки.
Роберт
7

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

CodeChef
источник
5

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

Макс Стрини
источник
3

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

Уилл Вусден
источник
2

Я не думал об этом много, но я просто лаконично говорю «к». Это коротко и сжато, и означает , что переменная передается в выражении. Я полагаю, что это может быть перепутано с цифрой 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"
Марк Брекетт
источник
2

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

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


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

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

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


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

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

Так как левая часть всегда является простым идентификатором в используемых до сих пор случаях [но дождитесь расширений, которые могут запутать это позже], я думаю, что для «c => expression» я бы прочитал «c» выражение lambda-function ' "'или даже" 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"

orcmid
источник
1
«Я бы не использовал« такой, что », потому что это подразумевает, что правая часть является предикатом» - когда он используется в качестве предиката, тогда это допустимый перевод, если я не понимаю вас неправильно.
Эрик Форбс
2

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

(n => n == String.Empty)

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

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

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

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

Jonesopolis
источник
2

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

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

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

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

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


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

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

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

Питер Воне
источник
1
Я не понимаю, как именно ваш вывод следует из вашей дискуссии. С другой стороны, я думаю, что характеристика => с точки зрения того, как замыкания могут (или не могут) быть реализованы, не является хорошим способом разобраться с заданным вопросом.
Orcmid
Первый абзац вводит в заблуждение. Лямбда-выражения - это конструкции первого класса. Функция встраивания - это оптимизация. Последний абзац тем более. Связанные переменные в лямбда-выражениях (которые вы называете «захваченными переменными») нигде не передаются. Они упакованы и добавлены как часть лямбда-объекта. Если бы они были приняты, вам пришлось бы назвать их снова - упомянуть одно отличие.
Neowizard
1

Частично проблема заключается в том, что вы можете прочитать его вслух по-разному в зависимости от его структуры. Жаль, что это не так красиво и не так интегрировано, как у Рубина.

Тэд Донаге
источник
Как вы говорите? Так же, как труба?
DTC
Трудно найти какое-либо руководство по этому вопросу, но _why использует «взять каждого», т.е. People.each {| person | ставит person.name}, становится "С людьми, берут каждого человека и печатают имя"
Адам Лассек
1

В Ruby этот же самый sybmol называется hashrocket, и я слышал, что программисты на C # тоже используют этот термин (хотя это неправильно).

Pharylon
источник
0

Мои два цента:

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

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

Аллан
источник
0

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

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

s, где s.Age больше 12 и s.Age меньше 20

'result = x => x * 2'

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

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

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

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

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

Артур
источник