Bardzo rzadko spotykam innych programistów!
Kiedy po raz pierwszy zobaczyłem ten token, pomyślałem, że „implikuje to”, ponieważ tak by go odczytał jako dowód matematyczny, ale najwyraźniej nie ma to sensu.
Jak więc powiedzieć lub przeczytać "=>" jak w: -
IEnumerable<Person> Adults = people.Where(p => p.Age > 16)
A może jest w ogóle uzgodniony sposób powiedzenia tego?
c#
.net
lambda
conventions
Christopher Edwards
źródło
źródło
Odpowiedzi:
Zwykle mówię „takie, że” czytając ten operator.
W Twoim przykładzie p => p.Age> 16 oznacza „P, czyli p.Age jest większe niż 16”.
W rzeczywistości zadałem to pytanie na oficjalnych forach linq przed wydaniem, a Anders Hejlsberg odpowiedział, mówiąc
Jeśli chodzi o „idzie do” - to nigdy nie miało dla mnie sensu. „p” nigdzie się nie wybiera.
W przypadku czytania komuś kodu, powiedzmy, przez telefon, o ile jest to inny programista C #, użyłbym po prostu słowa „lambda” - to znaczy „p lambda p dot wiek większy niż szesnaście."
W komentarzach Steve Jessop wspomniał o `` mapach do '' w przypadku transformacji - na przykładzie Andersa:
przeczytałbym
Wydaje się, że jest to znacznie bliższe rzeczywistej intencji kodu niż „staje się” w tym przypadku.
źródło
Z MSDN :
źródło
Czytanie kodu przez telefon
Od Erica Lipperta:
Osobiście powiedziałbym c => c + 1 jako „zobacz idzie zobaczyć plus jeden”. Kilka odmian, które słyszałem:
W przypadku projekcji (Klient c) => c.Nazwa: "klient widzi nazwę kropki"
W przypadku predykatu (Klient c) => c.Age> 21: "klient widzi taki, że wiek kropki jest większy niż dwadzieścia jeden"
źródło
Zawsze nazywałem to „operatorem wang” :-)
„wiek p większy niż 16”
źródło
Widziałem ludzi mówiących: „Arrow”.
źródło
Używam „idzie do”, ponieważ książka LINQ kazała mi :)
źródło
A co z „mapami do”? Jest zarówno zwięzły, jak i prawdopodobnie bardziej technicznie dokładny (tj. Nie ma sugestii zmiany stanu, jak w przypadku „idzie do” lub „staje się”, nie ma powiązania zbioru z jego charakterystyczną funkcją, jak z „taki, że” lub „dla którego”) niż inne alternatywy. Chociaż jeśli istnieje już standard, jak sugeruje strona MSDN, może powinieneś po prostu to zrobić (przynajmniej dla kodu C #).
źródło
„Mapy do” to moja preferowana wymowa. Mówiąc matematycznie, funkcja „odwzorowuje” swoje argumenty na zwracaną wartość (można by nawet nazwać tę funkcję „mapowaniem”), więc sensowne jest dla mnie używanie tej terminologii w programowaniu, szczególnie w programowaniu funkcyjnym (zwłaszcza w rachunku lambda) jest bardzo blisko matematyki. Jest również bardziej neutralny niż „staje się”, „idzie do” itp., Ponieważ nie sugeruje zmiany stanu, jak wspomniano bezkontekstowo.
źródło
Nie myślałem o tym zbyt wiele, ale po prostu powiem, że „do”. Jest krótki i zwięzły oraz sugeruje, że zmienna jest przekazywana do wyrażenia. Przypuszczam, że można to pomylić z cyfrą 2 („dwa”), ale podczas mówienia mam tendencję do wymawiania „bardziej jak„ ta ”. Nikt (kto przynajmniej zna lambdy) nigdy mi nie powiedział, że uważa to za niejednoznaczne ...
źródło
Moja krótka odpowiedź: „c 'lambda-of' e”. Chociaż lgnę do „lambda” c ”function„ e ”, myślę, że lambda-of jest ekumenicznym kompromisem. Analiza następuje.
To świetne pytanie, choćby ze względu na dziwaczne odpowiedzi. Większość tłumaczeń ma inne znaczenie niż wyrażenia lambda, co prowadzi do egzotycznych interpretacji. Jako stary haker wyrażający lambda po prostu ignoruję notację .NET i przepisuję ją na lambdę w mojej głowie, żałując, że nie zrobili w tym celu prawie niczego innego.
Aby móc opisywać kod przez telefon, chcesz, aby ktoś mógł zapisać kod po kolei. To jest oczywiście problem, ale strzałka lambda lub coś takiego jest prawdopodobnie najlepszą, jaką można uzyskać, albo może lambda-in, ale lambda-of jest najdokładniejsza.
Problemem jest użycie wrostka i to, jak nazwać całość i rolę lewej i prawej części czymś, co działa, gdy mówi się w miejscu wrostka.
To może być nadmiernie ograniczony problem!
Nie użyłbym „takiego, że”, ponieważ oznacza to, że prawa strona jest predykatem, który powinna spełniać lewa strona. To bardzo różni się od mówienia o prawej stronie, z której lewa strona została wyabstrahowana jako parametr funkcjonalny. (Oświadczenie MSDN dotyczące „Wszystkie wyrażenia lambda” jest po prostu obraźliwe i niedokładne).
Coś denerwuje w „zbliżaniu się”, chociaż może być tak blisko, jak to tylko możliwe. „Goes to” oznacza transformację, ale nie ma dokładnie takiej zmiennej c, która prowadzi do wyrażenia w c. Abstrakcja funkcji jest trochę nieuchwytna. Mógłbym się do tego przyzwyczaić, ale wciąż tęsknię za czymś, co podkreśli abstrakcję zmiennej.
Ponieważ lewa strona jest zawsze prostym identyfikatorem w dotychczas stosowanych przypadkach [ale poczekaj na rozszerzenia, które mogą to później zmylić], myślę, że dla wyrażenia "c =>" przeczytałbym wyrażenie "c" funkcja lambda " „” lub nawet „c” arg ”„ function ”expression”. W ostatnim przypadku mógłbym wtedy powiedzieć rzeczy takie jak „b 'arg' c 'arg' 'function' expression”.
Lepiej byłoby jeszcze bardziej wyjaśnić, że wprowadzane jest wyrażenie lambda i powiedzieć coś w rodzaju „'arg' b 'arg' c 'function' expression”.
Nauczenie się, jak przetłumaczyć to wszystko na inne języki, jest ćwiczeniem dla ucznia [; <).
Wciąż martwię się o "(b, c) => wyrażenie" i inne warianty, które mogą powstać, jeśli jeszcze tego nie zrobiły. Być może „'args' b, c 'wyrażenie funkcji'”.
Po tych wszystkich rozważaniach zauważam, że przechodzę do tłumaczenia „c => e” jako „'lambda' c 'function' e” i zauważam, że odwzorowanie na dokładną formę należy rozumieć w kontekście: λc (e ), c => e, f gdzie f (c) = e itd.
Spodziewam się, że wyjaśnienie „idzie do” przeważy po prostu dlatego, że w tym miejscu dominująca większość po raz pierwszy zobaczy wyrażenia lambda. Szkoda. Dobrym kompromisem może być „c ' lambda-of ' e”
źródło
Jeśli wyobrażasz sobie wyrażenie lambda jako metodę anonimową, to „idzie do” ma wystarczająco sens.
n "idzie do" wyrażenia n == String.Empty.
Przechodzi do metody anonimowej, więc nie musisz przechodzić do metody w kodzie!
Przepraszam za to.
Szczerze mówiąc, nie lubię używać słowa „idzie do” w mojej głowie, ale widziałem, jak inni ludzie mówili, że to dziwne, i pomyślałem, że to wyjaśnię.
źródło
Oprócz uzyskania poprzedniego zakresu (wszystkie zmienne i stałe, które są objęte zakresem normalnego wiersza kodu w miejscu, w którym występuje wyrażenie lambda, są dostępne dla kodu wyrażenia), wyrażenie lambda jest zasadniczo cukrem syntaktycznym dla funkcji wbudowanej.
Lista wartości po lewej stronie operatora produkcji ("=>") wpływa na strukturę i zawartość ramki stosu używanej do wywołania tej funkcji. Można powiedzieć, że lista wartości wnosi wkład zarówno do deklaracji parametrów, jak i do przekazywanych argumentów; w bardziej konwencjonalnym kodzie określają one strukturę i zawartość ramki stosu używanej do wywołania funkcji.
W rezultacie wartości „przechodzą do” kodu wyrażenia. Czy wolisz powiedzieć „definiuje ramkę stosu dla” czy „idzie do”? :)
W wąsko zdefiniowanym zastosowaniu wyrażeń boolowskich używanych jako warunki filtrujące (dominujące użycie wyrażeń lambda szeroko rozważane w innych odpowiedziach na to pytanie) bardzo rozsądne jest pominięcie metody na korzyść intencji kodu, a to prowadzi do " dla których „jest tak samo zwięzły i mówi więcej o znaczeniu kodu.
Jednak wyrażenia lambda nie są jedyną domeną Linq i poza tym kontekstem należy używać bardziej ogólnej formy „idzie do”.
Ale dlaczego „idzie”?
Ponieważ „wypełnia ramkę stosu poniższego kodu” jest o wiele za długa, aby to powtarzać. Przypuszczam, że można powiedzieć „jest / są przekazywane do”.
Istotna różnica między jawnie przekazanymi parametrami a przechwyconymi zmiennymi (jeśli dobrze pamiętam - popraw mnie, jeśli się mylę) polega na tym, że te pierwsze są przekazywane przez odniesienie, a drugie przez wartość.
źródło
Częściowo problem polega na tym, że można go odczytać na głos w różny sposób, w zależności od jego struktury. Szkoda, że nie jest tak ładny ani tak zintegrowany jak | Ruby's.
źródło
W Rubim ten sam sybmol nazywa się „hashrocket” i słyszałem, że programiści C # również używają tego terminu (nawet jeśli robienie tego jest złe).
źródło
Moje dwa centy:
„Wyrażenie lambda z parametrem s to {
return s.Age > 12 && s.Age < 20;
}”Podoba mi się to, ponieważ przypomina mi, skąd pochodzi wyrażenie lamdba
=> to tylko skrót, więc nie musisz używać słowa kluczowego delegate i dołączać informacje o typie, ponieważ może to zostać wywnioskowane przez kompilator.
źródło
Mój termin dla => zastosowany do pokazanych przykładów
s, gdzie s. wiek jest większy niż 12 i s. mniejszy niż 20 lat
x, gdzie x jest mnożone przez 2
c, gdzie c.city jest odpowiednikiem „Londynu”
n, gdzie n jest pustym łańcuchem
źródło