Làm cách nào để tôi phát âm Tiếng => Lời như được sử dụng trong các biểu thức lambda trong .Net


160

Tôi rất hiếm khi gặp bất kỳ lập trình viên khác!

Suy nghĩ của tôi khi lần đầu tiên nhìn thấy mã thông báo là "ngụ ý rằng" vì đó là những gì nó sẽ đọc nó như trong một bằng chứng toán học nhưng rõ ràng đó không phải là ý nghĩa của nó.

Vậy làm thế nào để tôi nói hoặc đọc "=>" như trong: -

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

Hoặc thậm chí có một cách đồng ý để nói nó?


6
120 phiếu bầu là khá đáng chú ý cho một câu hỏi đóng.
datps

Tôi luôn có xu hướng phát âm là "ngụ ý" là toán tử có cùng vẻ ngoài trong logic.
IllidanS4 muốn Monica trở lại vào

Câu trả lời:


149

Tôi thường nói 'như vậy' khi đọc toán tử đó.

Trong ví dụ của bạn, p => p.Age> 16 đọc là "P, sao cho p.Age lớn hơn 16."

Trên thực tế, tôi đã hỏi chính câu hỏi này trên các diễn đàn tiền phát hành chính thức của linq, và Anders Hejlsberg đã trả lời bằng cách nói

Tôi thường đọc toán tử => là "trở thành" hoặc "vì cái đó". Ví dụ:
Func f = x => x * 2;
Kiểm tra Func = c => c.City == "Luân Đôn";
đọc là "x trở thành x * 2" và "c mà c.City bằng London"

Theo như 'đi đến' - điều đó không bao giờ có ý nghĩa với tôi. 'P' không đi đâu cả.

Trong trường hợp đọc mã cho ai đó, giả sử, qua điện thoại, miễn là họ là lập trình viên C #, tôi chỉ sử dụng từ 'lambda' - nghĩa là, "p lambda p dot age lớn hơn mười sáu. "

Trong các bình luận, Steve Jessop đã đề cập đến 'bản đồ thành' trong trường hợp biến đổi - vì vậy, lấy ví dụ của Anders:

x => x * 2;

sẽ đọc

x ánh xạ tới x lần 2.

Điều đó dường như gần với ý định thực sự của mã hơn là 'trở thành' trong trường hợp này.


1
Điều đó chỉ chính xác khi lambda đang được sử dụng làm bộ lọc.
Andru Luvisi

4
"Goes to" là một kết xuất ít khó xử hơn "điền vào khung ngăn xếp của"
Peter Wone

1
Tôi thực sự không thích "x trở thành x * 2"; x là một đầu vào và vẫn giữ nguyên trong suốt. Đọc nó theo cách đó nghe giống như một hoạt động chuyển nhượng.
Germán

@Peter - hah, rất đúng. =) @ Germán - Tôi có xu hướng đồng ý, mặc dù tôi không thể nghĩ ra một ví dụ tốt hơn cho các phép biến đổi. Có lẽ 'biến thành'?
Erik Forbes

5
Tôi muốn nói "bản đồ đến" trong trường hợp đó. Có một rủi ro nhỏ khi mọi người nghĩ rằng bạn đang nói về một container, nhưng bạn có thể làm rõ điều đó bằng cách giải thích lần đầu tiên bạn nói, rằng ý của bạn là "toán tử lambda, bạn biết, bằng dấu hiệu lớn hơn- hơn".
Steve Jessop

56

Từ MSDN :

Tất cả các biểu thức lambda sử dụng toán tử lambda =>, được đọc là "đi đến".


7
Xen kẽ. Có lẽ thú vị hơn là nó đúng với phiên bản VS2010 , nhưng hướng dẫn đã bị xóa khỏi phiên bản VS2012 .
Blair Conrad

@BlairConrad - có thể đúng khi bạn viết nhận xét của mình, nhưng hiện tại nó đã có cho tất cả các phiên bản VS hiện tại.
cp.engr

Tôi không còn thấy các từ "đi đến" trong tài liệu MSDN được liên kết trong câu trả lời ở trên. Tôi nhớ khoảng năm 2010, một người cố vấn nói với tôi rằng hàm lambda nên được đọc là "đi đến" và đó là cách tôi luôn đọc nó. Tuy nhiên, vấp phải câu hỏi này, đọc nó là "như vậy" có ý nghĩa hơn đối với tôi.
matt.fc

18

Đọc mã qua điện thoại

Từ Eric Lippert:

Cá nhân tôi sẽ nói c => c + 1 là "thấy đi để thấy cộng một". Một số biến thể mà tôi đã nghe:

Đối với phép chiếu, (Khách hàng c) => c.Name: "khách hàng thấy sẽ thấy tên chấm"

Đối với một vị ngữ, (Khách hàng c) => c.Age> 21: "khách hàng thấy như vậy thấy tuổi chấm lớn hơn hai mươi mốt"


"Goes to" là cụm từ tôi nghe nhiều nhất khi làm việc trong các nhóm LINQ.
DamienG

15

Tôi đã luôn gọi nó là "toán tử wang" :-)

"p wang tuổi của p lớn hơn 16"


10
Đó là Numberwang!
comichael

4
Bạn phải cho tôi biết nơi nào khác trên hành tinh mà bất cứ ai gọi đây là "wang." Tôi đã có một thành viên trong nhóm nói với tôi rằng đó là một "wang" và nơi duy nhất trên mạng internet bất kỳ ai trong chúng ta có thể tìm thấy nó là câu trả lời này.
Kristopher

1
@Wartickler Tôi đến từ Tây Úc - luôn gọi nó là nhà điều hành wang :-)
Aidos

7

Tôi đã thấy mọi người nói, "Mũi tên."


6
Tôi hy vọng đó là một trò đùa.
Jacob Carpenter

Không phải - tôi đã thấy như vậy.
Erik Forbes

1
Tôi nghĩ những người nói "mũi tên" có nghĩa là: ->
Dour High Arch

6
Tôi chưa bao giờ thấy điều đó. Nghe nó, có thể, nhưng không thấy.
ctacke

Mũi tên có vẻ hợp lý với tôi vì nó có nghĩa là đại diện cho dấu hiệu mũi tên từ phép tính lambda. Tôi đã nghe các loại học thuật gọi nó là mũi tên hoặc mũi tên phải, tôi đã thấy mã Haskell trên các slide latex với toán tử -> được đổi thành biểu tượng mũi tên.
Robert

7

Tôi sử dụng "đi đến" vì một cuốn sách LINQ đã nói với tôi :)


5

Làm thế nào về "bản đồ đến"? Đó là cả ngắn gọn và chính xác hơn về mặt kỹ thuật (nghĩa là không có gợi ý về sự thay đổi trạng thái như với "đi đến" hoặc "trở thành", không có sự kết hợp của một tập hợp với chức năng đặc trưng của nó như với "như vậy" hoặc "vì điều đó") lựa chọn thay thế khác. Mặc dù nếu đã có một tiêu chuẩn như trang MSDN dường như ngụ ý, có lẽ bạn chỉ nên đi với điều đó (ít nhất là đối với mã C #).


3

"Bản đồ đến" là cách phát âm ưa thích của tôi. Về mặt toán học, một hàm "ánh xạ" các đối số của nó thành giá trị trả về của nó (người ta thậm chí có thể gọi hàm là "ánh xạ"), do đó, tôi nên sử dụng thuật ngữ này trong lập trình, đặc biệt là lập trình hàm (đặc biệt là phép tính lambda) rất gần với toán học. Nó cũng trung lập hơn "trở thành", "đi đến", v.v., vì nó không đề xuất thay đổi trạng thái, như bối cảnh được đề cập.


2

Tôi đã không nghĩ nhiều về nó, nhưng tôi chỉ nói ngắn gọn "với". Nó ngắn gọn và súc tích, và ngụ ý rằng biến được truyền cho biểu thức. Tôi cho rằng nó có thể bị nhầm lẫn với chữ số 2 ("hai"), nhưng tôi có xu hướng phát âm "thành" giống "ta" hơn khi nói. Không ai (ít người biết lambdas, ít nhất) đã từng nói với tôi rằng họ nghĩ nó mơ hồ ...

// "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âu trả lời ngắn gọn của tôi: "c 'lambda-of' e". Mặc dù tôi đang bám vào "'lambda' c 'chức năng' e", tôi nghĩ lambda-of là sự thỏa hiệp đại kết. Phân tích sau.

Đây là một câu hỏi tuyệt vời nếu chỉ dành cho những câu trả lời kỳ quái. Hầu hết các bản dịch có ý nghĩa khác ngoài cách diễn đạt lambda, dẫn đến những diễn giải kỳ lạ. Là một hacker biểu hiện lambda cũ, tôi chỉ bỏ qua ký hiệu .NET và viết lại thành lambda trong đầu trong khi ước họ đã làm hầu hết mọi thứ khác cho việc này.


Để tường thuật mã qua điện thoại, bạn muốn ai đó có thể viết mã theo trình tự. Đó là một vấn đề, tất nhiên, nhưng lambda-mũi tên hoặc một cái gì đó có lẽ là tốt nhất bạn có thể nhận được, hoặc có thể lambda-in, nhưng lambda-of là chính xác nhất.

Vấn đề là việc sử dụng infix và làm thế nào để đặt tên cho toàn bộ sự việc và vai trò của các phần bên trái và bên phải với một cái gì đó hoạt động khi được nói ở vị trí infix.

Đây có thể là một vấn đề quá hạn chế!


Tôi sẽ không sử dụng "như vậy" bởi vì điều đó ngụ ý rằng phía bên tay phải là một vị ngữ mà phía bên trái phải thỏa mãn. Điều đó rất khác với việc nói về một bên tay phải mà từ đó phía bên trái đã được trừu tượng hóa như một tham số chức năng. (Tuyên bố MSDN về "Tất cả các biểu thức lambda" chỉ đơn giản là gây khó chịu cũng như không chính xác.)

Một cái gì đó xếp hạng về "đi đến" mặc dù nó có thể gần như chúng ta có thể nhận được. "Goes to" ngụ ý một phép biến đổi, nhưng không có chính xác một số biến c đi đến một biểu thức trong c. Sự trừu tượng cho một chức năng là một chút khó nắm bắt. Tôi có thể quen với điều này, nhưng tôi vẫn khao khát một cái gì đó nhấn mạnh sự trừu tượng của biến.

Vì phía bên trái luôn là một mã định danh đơn giản trong các trường hợp được sử dụng cho đến nay [nhưng hãy đợi các tiện ích mở rộng có thể gây nhầm lẫn này sau này], tôi nghĩ rằng "c => biểu thức" tôi sẽ đọc biểu thức "c 'lambda-function" Biểu thức "'hoặc thậm chí" c' arg '' '. Trong trường hợp cuối cùng, sau đó tôi có thể nói những điều như biểu thức "b 'arg' c 'arg' 'function'.

Có thể tốt hơn để làm rõ hơn rằng một biểu thức lambda đang được giới thiệu và nói một cái gì đó như biểu thức "'arg' b 'arg' c 'function'".

Tìm hiểu làm thế nào để dịch tất cả những thứ này sang các ngôn ngữ khác là một bài tập cho học sinh [; <).

Tôi vẫn lo lắng về "(b, c) => biểu thức" và các biến thể khác có thể ra đời nếu chúng chưa có. Có lẽ "'args' b, c 'function' biểu thức".


Sau tất cả những suy ngẫm này, tôi nhận thấy rằng tôi sắp sửa dịch "c => e" thành "'lambda' c 'function' e" và nhận thấy rằng ánh xạ thành dạng chính xác sẽ được hiểu theo ngữ cảnh: λc (e ), c => e, f trong đó f (c) = e, v.v.

Tôi hy vọng rằng lời giải thích "đi đến" sẽ thắng thế đơn giản bởi vì đây là nơi mà đa số chiếm ưu thế sẽ lần đầu tiên nhìn thấy biểu thức lambda. Đó là một điều đáng tiếc. Một sự thỏa hiệp tốt có thể là "c ' lambda-of ' e"


1
'' Tôi sẽ không sử dụng "như vậy" bởi vì điều đó ngụ ý rằng phía bên tay phải là một vị ngữ '' - khi nó được sử dụng như một vị ngữ, thì đây là một bản dịch hợp lệ, trừ khi tôi hiểu nhầm bạn.
Erik Forbes

2

Nếu bạn tưởng tượng một biểu thức lambda là phương thức ẩn danh, thì "đi đến" có nghĩa là đủ.

(n => n == String.Empty)

n "đi đến" biểu thức n == String.Empty.

Nó đi đến phương thức ẩn danh, vì vậy bạn không cần phải đi đến phương thức trong mã!

Xin lỗi vì điều đó.

Thành thật mà nói, tôi không thích sử dụng "đi đến" trong đầu, nhưng tôi thấy những người khác nói nó có vẻ kỳ lạ, và tôi nghĩ tôi đã làm rõ điều đó.


2

Ngoài việc có được phạm vi trước (tất cả các biến và hằng trong phạm vi cho một dòng mã thông thường tại điểm xảy ra biểu thức lambda đều có sẵn cho mã của biểu thức), một biểu thức lambda về cơ bản là đường cú pháp cho hàm nội tuyến.

Danh sách các giá trị ở bên trái của toán tử sản xuất ("=>") đóng góp cấu trúc và nội dung của khung ngăn xếp được sử dụng để thực hiện cuộc gọi đến hàm này. Bạn có thể nói rằng danh sách các giá trị đóng góp cả khai báo tham số và các đối số được truyền; trong mã thông thường hơn, chúng xác định cấu trúc và nội dung của khung stack được sử dụng để thực hiện cuộc gọi đến một hàm.

Kết quả là các giá trị "đi đến" mã biểu thức. Bạn có muốn nói "xác định khung ngăn xếp cho" hoặc "đi đến" không? :)

Trong ứng dụng được định nghĩa hẹp của các biểu thức boolean được sử dụng làm điều kiện lọc (việc sử dụng chủ yếu các biểu thức lambda được xem xét rộng rãi bởi các câu trả lời khác cho câu hỏi này), rất hợp lý để bỏ qua phương thức có lợi cho mục đích của mã và điều này dẫn đến " trong đó "chỉ là cô đọng và nói nhiều hơn về ý nghĩa của mã.

Tuy nhiên, các biểu thức lambda không phải là tỉnh duy nhất của Linq và bên ngoài bối cảnh này, nên sử dụng hình thức tổng quát hơn "đi đến".


Nhưng tại sao "đi đến"?

Bởi vì "điền vào khung ngăn xếp của đoạn mã sau" quá dài để tiếp tục nói. Tôi cho rằng bạn có thể nói "được / được chuyển đến".

Một sự khác biệt quan trọng giữa các tham số được truyền rõ ràng và các biến được bắt (nếu tôi nhớ chính xác - sửa tôi nếu tôi sai) là cái trước được truyền bằng tham chiếu và cái sau theo giá trị.


1
Tôi không thấy chính xác kết luận của bạn sau cuộc thảo luận của bạn. Mặt khác, tôi nghĩ rằng việc mô tả đặc trưng => về cách đóng cửa có thể (hoặc có thể không) được thực hiện không phải là một cách hay để nắm bắt được câu hỏi được hỏi.
orcmid

Đoạn đầu tiên là sai lệch. Biểu thức Lambda là cấu trúc lớp đầu tiên. Chức năng nội tuyến là một tối ưu hóa. Đoạn cuối thậm chí còn hơn thế. Các biến bị ràng buộc trong biểu thức lambda (cái mà bạn gọi là "biến bị bắt"), không được truyền vào bất cứ đâu. Chúng được đóng hộp và thêm vào như một phần của đối tượng lambda. Nếu chúng được thông qua, bạn phải đặt lại tên cho chúng - để đề cập đến một điểm khác biệt.
Neowizard

1

Một phần của vấn đề là bạn có thể đọc to thành tiếng khác nhau tùy thuộc vào cách cấu trúc của nó. Thật xấu hổ vì nó không đẹp hoặc được tích hợp như của ruby.


Bạn nói thế nào? Giống như đường ống?
dtc

Khó tìm thấy bất kỳ hướng dẫn nào về điều này, nhưng _why sử dụng "lấy từng cái", tức là People.each {| person | đặt person.name} trở thành "Với mọi người lấy mỗi người và in tên"
Adam Lassek

1

Trong Ruby, sybmol tương tự này được gọi là "hashrocket" và tôi đã nghe các lập trình viên C # cũng sử dụng thuật ngữ đó (mặc dù làm như vậy là sai).


0

Theo quan điểm của tôi:

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

"Biểu thức Lambda với tham số s là { return s.Age > 12 && s.Age < 20; }"

Tôi thích điều này bởi vì nó nhắc tôi về việc biểu hiện lamdba đến từ đâu

delegate(Student s) { return s.Age > 12 && s.Age < 20; };

=> chỉ là một phím tắt để bạn không phải sử dụng từ khóa ủy nhiệm và bao gồm thông tin loại vì trình biên dịch có thể được suy ra.


0

Thuật ngữ của tôi cho => như được áp dụng cho các ví dụ hiển thị kết quả

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

s trong đó s.Age lớn hơn 12 và s.Age nhỏ hơn 20

'result = x => x * 2'

x trong đó x được nhân với 2

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

c trong đó c.city tương đương với "London"

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

n trong đó n là một chuỗi rỗng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.