2010-09-30 49 views
38

Gần đây tôi có hai cuộc phỏng vấn qua điện thoại.Phỏng vấn: Biểu thức Lambda là gì?

Trong cả hai cuộc phỏng vấn, tôi đã được hỏi là câu hỏi cuối cùng để xác định biểu thức Lambda.

Tôi đã xác nhận rằng biểu thức Lambda là một phương thức chưa được đặt tên thay cho người được ủy quyền. Nhưng bằng cách nào đó không đủ.

Tôi thấy rất khó giải thích chính xác điều này trong cuộc phỏng vấn qua điện thoại.

Có ai biết rõ hơn không?

+2

http://stackoverflow.com/questions/471502/what-is-linq/471592#471592 Phần trên "Hãy bắt đầu thăm dò này". –

+1

Tất cả các phương thức LINQ được đặt tên. Một số sử dụng các phương thức chưa được đặt tên làm tham số, tức là các phương thức ẩn danh hoặc các biểu thức lambda – Greg

+0

Tôi không thể tin được số lượng người trả lời bản sao rõ ràng này. –

Trả lời

33

Biểu thức Lambda là các hàm không tên được cung cấp dưới dạng giá trị không đổi. Chúng có thể xuất hiện ở bất kỳ nơi nào mà bất kỳ hằng số nào khác có thể, nhưng thường được viết dưới dạng tham số cho một số hàm khác. Ví dụ kinh điển là bạn sẽ vượt qua một hàm so sánh với một thói quen "sắp xếp" chung chung, và thay vì đi đến sự cố định nghĩa toàn bộ hàm (và phát sinh sự gián đoạn từ vựng và không gian tên) để mô tả sự so sánh này, bạn có thể thông qua một biểu thức lambda mô tả so sánh.

BAO GIỜ, điều này bỏ sót một trong những tính năng quan trọng nhất của Biểu thức Lambda, là chúng thực thi trong ngữ cảnh xuất hiện của chúng. Do đó, họ có thể sử dụng các giá trị của các biến được xác định trong ngữ cảnh đó. Điều này phân biệt các con trỏ hàm từ các biểu thức lambda đúng. Trong các ngôn ngữ hỗ trợ các biến có thể thay đổi, các biểu thức lambda thích hợp cung cấp khả năng thay đổi các giá trị của các biến đó.

Biểu thức Lambda xuất hiện (với cú pháp khác nhau) trong tất cả các phiên bản LISP, Perl, Python và C++, Objective C, C# và Java 8 gần đây, nhưng đáng chú ý là không có trong C mặc dù nó có cách xử lý các hàm truyền (hoặc một số lý do cho chúng) xung quanh như các tham số. Chúng là một phần tử cú pháp với ngữ nghĩa cụ thể, và các ngữ nghĩa đó đặt thêm các yêu cầu về thời gian chạy hơn C được thiết kế để yêu cầu.

+3

Biểu thức Lambda có sẵn trong Java như của JDK-1.8 Tôi tin rằng chúng trông rất giống với các biểu thức Lambda trong C#, ngoại trừ "Fat Arrow" của Java là mỏng; -> như trái ngược với => – series0ne

1

Có thể họ chỉ muốn nghe rằng LINQ là "Truy vấn tích hợp ngôn ngữ".

Điều đó đang được nói, nếu họ thực sự muốn giải thích về "cái gì" LINQ bao gồm, tôi có lẽ sẽ bao gồm thêm thông tin mà bạn cung cấp. Một cái gì đó như:

LINQ, hoặc truy vấn tích hợp ngôn ngữ, là tập hợp các bổ sung ngôn ngữ và các lớp khung được thêm vào .NET 3.5 cho phép tiếp cận chức năng hơn cho các hoạt động truy vấn. Nó dựa trên các phương thức mở rộng cho IEnumerable và IQueryable và các đối tác chung của chúng, cho phép thực hiện trì hoãn trong LINQ to Objects và xử lý từ xa thông qua IQueryable, cũng như nhiều tính năng khác. Cũng có những thay đổi ngôn ngữ được thực hiện cho C# và VB.NET để hỗ trợ cú pháp truy vấn "tự nhiên" trực tiếp hơn trong ngôn ngữ.

0

Có thể họ đang tìm bạn để biết rằng LINQ là DSL mới cho truy vấn IQueryableIEnumerable đối tượng. Cú pháp "từ ... ở đâu ... chọn ...", về cơ bản. Biết rằng nó được thực hiện dưới-the-cover với lambdas và phong cách chức năng có thể sẽ giúp bạn có được điểm thưởng.

1

Tôi đã nói rằng LINQ là một phương pháp chưa được đặt tên thay cho người được ủy quyền.

Thực ra, đó không phải LINQ chút nào, nhưng là "biểu thức lambda". Và về mặt kỹ thuật, LINQ thậm chí không sử dụng chúng.

LINQ là viết tắt của "Truy vấn tích hợp ngôn ngữ". Khá đặc biệt, đó là từ khóa "từ ... nơi .. chọn" (nghĩa là, cú pháp truy vấn được tích hợp vào ngôn ngữ ).

Bây giờ, để làm cho những từ khóa đó hoạt động, nhiều thứ được thêm vào ngôn ngữ (và CLR) (chẳng hạn như lambdas, phương thức mở rộng, lớp Enumerable, v.v.).

+0

Tôi vừa mới nhận ra mình đã hủy hoại câu hỏi. Bạn đúng rồi. Câu hỏi shoudl là biểu hiện của Lambda. Vào thời điểm viết bài này, tôi đã có một số suy nghĩ về LINQ. :( – Houman

1

Để trả lời câu hỏi đã được sửa đổi của bạn, cho câu hỏi đó, bạn trả lời thực sự tốt. Sự thay đổi duy nhất tôi muốn làm là nhấn mạnh từ "nội tuyến".

Biểu thức Lambda là một phương thức chưa được đặt tên được viết nội tuyến tại chỗ cần có đại biểu.

13

Biểu thức lambda là mã treo không tên.

Hãy xem xét chức năng "nhân hai điều" ẩn danh này (a.k.a.biểu thức lambda), sử dụng một số ký pháp rất không cụ thể.

λ(x, y) -> x * y 

Câu trả lời của bạn rất cụ thể cho một nơi bạn đã sử dụng lambdas (tôi đoán C#?) Và tôi nghi ngờ người phỏng vấn đang yêu cầu hiểu biết chung hơn. Khái niệm về một đại biểu, ngôn ngữ C#, và ý tưởng của một phương thức đều là thứ yếu đối với lambda là gì và cách chúng hoạt động. Bạn có thể tính toán bằng cách sử dụng biểu thức lambda on paper, chẳng hạn, không có phương pháp nào có liên quan.

+2

Tôi sẽ thoát khỏi khái niệm "mã" cụ thể: trừu tượng lambda là về tính toán, không phải bất kỳ ngôn ngữ cụ thể nào trong đó tính toán như vậy có thể được mô tả. – Ian

Các vấn đề liên quan