2010-07-02 38 views

Trả lời

5

Chúng không hoàn toàn giống nhau. Cả hai tạo ra các lớp chưa được đặt tên, nhưng sự giống nhau của chúng kết thúc tại thời điểm đó.

Trong C++, bạn tạo một kết thúc bắt các biến cục bộ của mình, tùy ý bằng cách tham chiếu. Trong Java, bạn chỉ nhận được một ảnh chụp nhanh của các giá trị biến cục bộ hiện tại (và các biến đó cần phải là "cuối cùng").

Mục đích của các lớp bên trong vô danh là mở rộng một lớp khác hoặc triển khai một giao diện đặc biệt khác. Vì lý do đó, các lớp bên trong vô danh có thể mô phỏng công việc của các biểu thức lambda để mở rộng một số, ví dụ bằng cách thực hiện giao diện Runnable. Các biểu thức lambda được thiết kế đặc biệt để được gọi và có thể sửa đổi các biến cục bộ trong môi trường của chúng.

+0

Ngoại trừ việc truy cập các biến trong phạm vi không có sự khác biệt đúng? – yesraaj

+1

@yesraaj, tôi không biết chi tiết về các lớp bên trong. Nhưng vì mục đích là hoàn toàn khác nhau, tôi nghĩ chúng ta không thể so sánh chúng bằng các phương pháp lành mạnh. Trong các lớp bên trong vô danh, những gì bạn chỉ định trong phần nội dung được sao chép vào thân thể lớp chưa được đặt tên được tạo ra. Vì vậy, bạn có thể thêm nhiều phương thức, các thành viên lớp, vv .. Đối với C++ lambdas, bạn chỉ cần xác định nội dung của toán tử ""(). –

+0

+1. Như một lưu ý phụ, C# cung cấp một cách tiếp cận khác cho vấn đề đóng cửa với lambdas của riêng nó mà luôn luôn nắm bắt bằng cách tham chiếu tất cả các biến địa phương. Bạn có thể đọc về Java/C# trong [The Beauty of Closures] (http://csharpindepth.com/Articles/Chapter5/Closures.aspx) trong blog của Jon Skeet. Bài viết không đối phó với C++ lambdas, nơi bạn có thể chụp theo giá trị hoặc tham chiếu, nhưng như trong hầu hết các trường hợp khác trong C++, bạn phải cẩn thận về thời gian tồn tại của các tham chiếu đã capture của mình - lambda không được sử dụng sau khi tham chiếu các đối tượng đã bị phá hủy. –

2

C++ Biểu thức lambda 0x là phương thức chưa đặt tên, lớp ẩn danh Javas là các lớp chưa đặt tên. Vì vậy, họ chia sẻ không có tên nhưng các khái niệm khác nhau.

Bắt đầu với thực tế rõ ràng nhất, hàm lambda (có thể) trả về một giá trị và các lớp ẩn danh có thể được sử dụng để tạo các cá thể (đối tượng).

BTW - wikipedia đề cập, chỉ có lambda chức năng được đề xuất cho C++ 0x.

+0

sử dụng phương thức từ là một hàng bỏ lỡ hàng đầu, biểu thức lambda không phải là các phương thức ẩn danh mà chúng là hàm ẩn danh . –

+0

@snk_kid: Trong C++, chúng giống nhau. Các hàm lớp là các phương thức thành viên. – Puppy

+0

@DeadMG Các phương thức thể hiện không giống như một hàm, đặc biệt là trong ý nghĩa truyền thống/nguyên gốc của từ đó từ các ngôn ngữ như Smalltalk và Objective-C. Các phương thức là thuật ngữ OO, chúng không phải là phép tính lambda hay thuật ngữ lập trình hàm, không có 'phương thức' trong các ngôn ngữ chức năng như Haskell hay SML. Vì vậy, như tôi đã nói bằng cách sử dụng phương pháp từ là gây hiểu lầm và không chính xác. –

4

Lớp bên trong ẩn danh Java có thể tham chiếu đến final dữ liệu trong phương pháp kèm theo và để tất cả dữ liệu (bao gồm cả có thể thay đổi) trong lớp kèm theo. Vì vậy, các phương thức trong các lớp ẩn danh không thể thay đổi các giá trị của các biến trong phương thức kèm theo, nhưng chúng có thể thay đổi giá trị của các thành viên trong lớp kèm theo.

C++ lambda có thể tham chiếu tất cả dữ liệu (kể cả có thể thay đổi) trong hàm kèm theo và nếu được lồng trong hàm thành viên thì có thể thực hiện tương tự cho dữ liệu của lớp kèm theo. Mức độ phụ thuộc chính xác vào (các) phạm vi kèm theo được tuyên bố bởi lập trình viên, vì vậy nó rõ ràng hơn là ngầm định.

Điều này làm cho chúng khá giống nhau nhưng tính năng Java xử lý các biến/tham số cục bộ theo các phương pháp khác nhau, trên nguyên tắc không nên biến đổi từ bên ngoài phương pháp, đặc biệt là trong ngôn ngữ có thói quen truyền thống.

So sánh với C# lambdas, không có hạn chế và tất cả các phụ thuộc đều tiềm ẩn. Điều này khiến cho chúng trở nên kém tiết kiệm nhất trong các tính năng này (cũng được giúp bởi chúng có suy luận kiểu tốt nhất). Nhưng mặt khác, chúng làm mất hiệu lực tất cả các quy tắc đơn giản về luồng, tức là nó không nhất thiết đúng là các biến cục bộ là "trên ngăn xếp luồng" và do đó không bao giờ yêu cầu khóa trước khi truy cập.

+0

Câu trả lời tuyệt vời.Bạn có bất kỳ tài nguyên cụ thể nào, mà tôi có thể sử dụng để biết chi tiết (và có thể triển khai) các hàm lambda java tốt hơn không? –

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