Як я вимовляю "=>", як використовується в лямбда-виразах у .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;
Тест функцій = c => c.City == "Лондон";
читається як "x стає x * 2" і "c, для якого c.City дорівнює Лондону"

Що стосується "переходу" - це для мене ніколи не мало сенсу. 'p' нікуди не дінеться.

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

У коментарях Стів Джессоп згадав "карти на" у випадку перетворень - тому беручи приклад Андерса:

x => x * 2;

читав би

x карта в x разів 2.

Це здається набагато ближчим до фактичного наміру коду, ніж "стає" для цього випадку.


1
Це точно лише тоді, коли лямбда використовується як фільтр.
Андру Лувісі

4
"Відходить" - це менш незручне відображення "заповнює рамку стека"
Peter Wone

1
Мені дуже не подобається "x стає x * 2"; x є входом і залишається однаковим протягом усього часу. Читання цього способу звучить як операція призначення.
Герман

@Peter - га, дуже правда. =) @ Germán - Я схильний погодитися, хоча не можу придумати кращого прикладу для перетворень. Може, "перетворюється на"?
Ерік Форбс

5
У такому випадку я б сказав "карти на". Тоді є невеликий ризик, коли люди думають, що ви говорите про контейнер, але ви можете зрозуміти це, пояснивши, коли вперше ви це говорите, що ви маєте на увазі "оператор лямбда, знаєте, рівний-знак-більший- ніж ".
Стів Джессоп

56

Від MSDN :

Усі лямбда-вирази використовують оператор лямбда =>, який читається як "переходить до".


7
Інтестування. Можливо, цікавіше те, що це було правдою для версії VS2010 , але керівництво було видалено з версії VS2012 .
Блер Конрад

@BlairConrad - можливо, це правда, коли ви писали свій коментар, але він є для всіх поточних версій VS зараз.
cp.engr

Я більше не бачу слів "йде в" в документації MSDN, пов'язаній у вищевказаній відповіді. Я пам’ятаю, що близько 2010 року наставник сказав мені, що лямбда-функцію слід читати як «переходить до», і саме так я завжди її читав. Натрапляючи на це питання, проте, читати його як "таке, що" має для мене більше сенсу.
matt.fc

18

Код для читання по телефону

Від Еріка Ліпперта:

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

Для проекції: (Клієнт c) => c.Name: "Показник клієнта стає див. Ім'я точки"

Для предиката, (Клієнт c) => c.Age> 21: "клієнт бачить такий, що вік крапки перевищує двадцять один"


"Іде" - це фраза, яку я найбільше почув, працюючи над командами LINQ.
DamienG

15

Я завжди називав це "оператором ван" :-)

"вік p p більше 16"


10
Ось нумар!
comichael

4
Ти мусиш сказати мені, де ще на планеті хтось називає цю «вангу». У мене був член команди, який скаже мені, що це "ванг", і єдине місце в інтернеті, який кожен з нас може знайти, це саме на цю відповідь.
Крістофер

1
@Wartickler Я з Західної Австралії - завжди називали її оператором Ван :-)
Айдос

7

Я бачив, як люди кажуть: "Стрілка".


6
Я сподіваюся, що це жарт.
Яків Карпентер

Це не так - я бачив те саме.
Ерік Форбс

1
Я думаю, що люди, які говорять "стрілка", мають на увазі це: ->
Dour High Arch

6
Я ніколи цього не бачив. Чув, може, але не бачив.
ctacke

Стрілка здається мені розумною, оскільки вона означала зображення стрілки з обчислення лямбда. Я чув, як академічні типи називають його стрілкою або стрілкою праворуч, я бачив код Haskell на слайдах латексу, коли оператор -> змінений на символ стрілки.
Роберт

7

Я використовую "переходить до", тому що книга LINQ мені сказала :)


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 'lambda-of' e". Хоча я чіпляюся за "функцію" лямбда "с" е ", я думаю, що лямбда - це екуменічний компроміс. Аналіз випливає.

Це чудове запитання, якщо тільки для химерних відповідей. Більшість перекладів мають інші значення, ніж для лямбдаських виразів, що призводить до екзотичних інтерпретацій. Як старий хакер-лямбда-вираз, я просто ігнорую нотацію .NET і переписую її як лямбда в голові, бажаючи, щоб вони зробили для цього майже все інше.


Щоб повідомити код по телефону, ви хочете, щоб хтось міг записати код послідовно. Це, звичайно, проблема, але лямбда-стрілка чи щось є, мабуть, найкращим, що ви можете отримати, або, можливо, лямбда-в, але лямбда-з є найбільш точним.

Проблема полягає у використанні інфіксації та в тому, як називати всю річ та роль лівої та правої частин із тим, що працює, коли розмовляють у місці інфікування.

Це може бути надмірно обмеженою проблемою!


Я б не використовував "таке, що", тому що це означає, що права рука - це предикат, який повинен задовольняти лівий. Це дуже відрізняється від розмови про праву частину, від якої ліва частина була абстрагована як функціональний параметр. (Заява MSDN про "Усі лямбда-вирази" є просто образливою, а також неточною.)

Щось підходить до "йде", хоча це може бути настільки ж близьким, наскільки ми можемо отримати. "Іде до" передбачає перетворення, але точно не існує певної змінної c, яка переходить до виразу c. Абстрагування функції є дещо невловимим. Я міг би звикнути до цього, але все одно прагну до чогось, що підкреслює абстрагування змінної.

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

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

З'ясування того, як перекласти все це на інші мови, є вправою для учня [; <).

Я все ще переживаю за "(b, c) => вираз" та інші варіанти, які можуть виникнути, якщо їх ще не було. Можливо, "'args' b, c 'function' izraz".


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

Я очікую, що пояснення "перехід до" переважатиме просто тому, що саме тут домінуюча більшість збирається вперше побачити лямбданські вирази. Це шкода. Хорошим компромісом може бути "c" лямбда-оф -е "


1
"Я б не використовував" такий, що ", тому що це означає, що права рука є присудком" - коли він використовується як присудок, то це правильний переклад, якщо я вас не розумію.
Ерік Форбс

2

Якщо ви уявляєте лямбда-вираз як анонімний метод, який він є, "йде" має достатній сенс.

(n => n == String.Empty)

n "переходить до" виразу n == String.Empty.

Він переходить до анонімного методу, тому вам не доведеться переходити до методу в коді!

Вибачте за це.

Чесно кажучи, мені не подобається використовувати "іде" в моїй голові, але я побачив інших людей, які казали, що це здається дивним, і я подумав, що зрозумію.


2

Крім придбання попередньої області застосування (всі змінні та константи, які знаходяться в межах звичайного рядка коду в точці, де відбувається вираз лямбда, доступні для коду виразу), лямбда-вираз по суті є синтаксичним цукром для вбудованої функції.

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

В результаті значення "переходять до" коду виразу. Ви б краще сказати "визначає рамку стека для" або "переходить до"? :)

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

Однак лямбда-вирази - не єдина провінція Лінк, і поза цим контекстом слід використовувати більш загальну форму "перехід".


Але чому "йде"?

Оскільки "заповнює рамку стека з наступного коду" занадто довго, щоб продовжувати говорити. Я думаю, ви могли б сказати "є / передається".

Вирішальна різниця між явно переданими параметрами та захопленими змінними (якщо я пам'ятаю правильно - виправте мене, якщо я помиляюся) полягає в тому, що перші передаються за посиланням, а другі за значенням.


1
Я не бачу, як саме ваш висновок випливає з вашої дискусії. З іншого боку, я думаю, що характеристика => з точки зору того, як закриття може (або не може) здійснитись, не є гарним способом вирішити питання, яке задається.
orcmid

Перший абзац вводить в оману. Лямбдаські вирази - це першокласні конструкції. Функція вбудовування - це оптимізація. Останній абзац тим більше. Зв'язані змінні в лямбда-виразах (те, що ви називаєте "захоплені змінні") ніде не передаються. Вони містяться в коробці і додаються як частина лямбда-об'єкта. Якби вони були передані, вам доведеться назвати їх ще раз - згадати одну різницю.
Neowizard

1

Частина проблеми полягає в тому, що ви можете читати її вголос по-різному в залежності від того, як вона структурована. Прикро, що це не так красиво або настільки інтегровано, як рубінові |


Як ви говорите | Те саме, що і труба?
dtc

Важко знайти будь-який посібник з цього приводу, але _ чому використовується "взяти кожного", тобто People.each {| людина | Ставить person.name} стає "З людьми беруть кожну людину і друкують ім'я"
Адам Лассек

1

У Ruby цей самий sybmol називається "hashrocket", і я чув, що програмісти C # також використовують цей термін (навіть якщо це неправильно).


0

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

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

"Lambda Вираз з параметром s дорівнює { return s.Age > 12 && s.Age < 20;}"

Мені це подобається, тому що це нагадує мені, звідки походить ламбба-вираз

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'

x де x помножено на 2

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

c, де c.city еквівалентно "London"

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

n де n порожній рядок

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.