2012-03-09 14 views
8

tôi có thể làm như sau trong C++Có foreach phương pháp chung trong Delphi cho rằng có thể được gọi với chức năng ẩn danh

for_each(vec->begin(), vec->end(), [](int n){cout << n << " " << endl;}); 

Tôi muốn làm điều tương tự/tương tự trong Delphi. Tôi đã hỏi question trước đó cho các nhà phát triển C++ và muốn tạo ví dụ tương tự trong OOP Pascal. Phần lambda (vô danh) của câu hỏi là không liên quan thực sự, nhưng tôi đã tự hỏi nếu tôi có thể làm tương tự trong Delphi XE2.

Tôi hỏi vì tôi có XE và tôi không chắc liệu nó đã được thêm vào chưa. Cảm ơn.

Trả lời

6

Có lẽ tương tự Delphi gần nhất với std::vector<T>TList<T>. Bạn có thể duyệt qua danh sách với một vòng lặp for in:

var 
    Item: Integer; 
    List: TList<Integer>; 
.... 
for Item in List do 
    Writeln(Item); 

Nếu bạn có một mảng động chứ không phải là một TList<T> sau đó bạn có thể sử dụng for in để lặp qua các yếu tố. Trên thực tế, tất cả các thùng chứa được tích hợp đều hỗ trợ for in và thật dễ dàng để thêm hỗ trợ cho for in vào các lớp học của riêng bạn.

Trong C++ không có gì giống như vòng lặp for in và do đó thành ngữ là sử dụng thuật toán STL. Đó là những gì khiến bạn sử dụng một hàm ẩn danh. Trong Delphi với cú pháp for in, bạn có thể diễn tả "lặp lại tất cả các thành viên của vùng chứa" theo cách tự nhiên mà không cần dùng đến các phương thức nặc danh.

Generics được thêm vào Delphi tại Delphi 2009 và vòng lặp for in đã được thêm vào Delphi 2005, vì vậy tất cả điều này có sẵn cho bạn trong XE. Đối với những gì nó có giá trị, vô danh cũng đã được thêm vào trong Delphi 2009.

Những gì bạn phải nhận ra là các generics Delphi ít mạnh hơn các mẫu C++. Mặc dù bạn nói về một số chung là foreach, mã của bạn không phải là chung chung theo nghĩa là mã đó có chuyên ngành int. Bạn có thể viết một phiên bản chung của mã của bạn trong C + + nhưng điều này sẽ khó khăn hơn nhiều để làm với Generics Delphi do những hạn chế vốn có của generics khi so sánh với các mẫu. Một nỗ lực để viết mã trên một cách chung chung trong Delphi sẽ sáng lập tại thời điểm mà bạn đã cố gắng gọi Writeln. Trong khi đó sẽ là tầm thường với các mẫu C++ nó là bực bội ngoài tầm với cho Generics.

Cập nhật: Trong các nhận xét bạn hỏi nếu có cách khéo léo để thêm nội dung của vùng chứa này vào vùng chứa khác. Phương thức AddRange thực hiện điều đó. TList<T>.AddRange() có ba biến thể quá tải nhận một trong các thông số đầu vào sau: array of T, Collection: IEnumerable<T> hoặc Collection: TEnumerable<T>. Tất cả các thùng chứa chung tiêu chuẩn đều theo một mẫu tương tự.

+0

Đó là cách tôi đã thực hiện: đối với i: = 0 đến n - 1 do result.Add (i); Nhưng tôi đã tự hỏi cho dù chức năng chung như vậy tồn tại :) – Mihaela

+3

Cú pháp Lambda/Closure/Anonfunction là CLUNKY trong delphi mà nó là khá lớn mà bạn không cần nó cho 'for' vòng. Thành ngữ C++ như thường lệ, không dịch tốt sang pascal. Nhưng C# và Delphi là khá gần thực sự. –

+0

Tôi thấy nó khá hữu ích trong C++. Không chỉ là trình dọn dẹp mã (đối với các hàm ẩn danh nhỏ), nhưng trong C++ nó thường được nội tuyến và tạo mã nhanh hơn. – Mihaela

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