2014-07-08 11 views
5

std.conv.to!string(enum.member) hoạt động như thế nào? Làm thế nào có thể một hàm nhận một thành viên enum và trả về tên của nó? Liệu nó sử dụng một phần mở rộng trình biên dịch hoặc một cái gì đó tương tự? Đó là một chút bình thường với tôi kể từ khi tôi đến từ thế giới C/C++.Làm thế nào để chuỗi! (Enum.member) hoạt động?

Trả lời

8

Những gì nó làm là sử dụng phản ánh thời gian biên dịch trên loại enum để nhận danh sách thành viên (tên dưới dạng chuỗi) và giá trị của chúng. Nó xây dựng một câu lệnh chuyển đổi từ thông tin này để tra cứu nhanh để lấy tên từ một giá trị. to!SomeEnum("a_string") sử dụng nguyên tắc tương tự, chỉ theo một hướng khác.

Thông tin phản ánh thời gian biên dịch được truy cập với __traits(allMembers, TheEnumType), trả về danh sách các chuỗi có thể được lặp lại để xây dựng câu lệnh chuyển đổi. Sau đó, __traits(getMember, TheEnumType, memberName) được sử dụng để tìm nạp nội dung.

đặc điểm có thể được nhìn thấy hơn ở đây: http://dlang.org/traits.html#allMembers

Đó allMembers một hoạt động trên nhiều loại, không chỉ các lớp học như đã thấy trong ví dụ này, mà còn cấu trúc, sự đếm, và nhiều hơn nữa, ngay cả mô-đun.

Mã phobos nguồn có một số ví dụ như EnumMembers trong std.traits: https://github.com/D-Programming-Language/phobos/blob/master/std/traits.d#L3360

dù nguồn phobos là kinda khó đọc, nhưng trên dòng 3399, ở dưới cùng của chức năng đó, bạn có thể thấy nó bằng cách sử __traits(allMembers) như nguồn dữ liệu của nó. std.conv.to được triển khai theo nhiều chức năng std.traits.

Bạn cũng có thể kiểm tra các chương mẫu tab để có được những chương Reflection ra sách dạy nấu các D của tôi mà thảo luận về công cụ này quá:

http://www.packtpub.com/discover-advantages-of-programming-in-d-cookbook/book

Ví dụ cuối cùng trong chương cho thấy làm thế nào để sử dụng một số khả năng phản chiếu để xây dựng một bộ điều phối chức năng nhỏ dựa trên các chuỗi. Các chương sau (không có sẵn miễn phí mặc dù) cho thấy làm thế nào để xây dựng một chuyển đổi ra khỏi nó cho hiệu quả tốt hơn quá. Nó thực sự khá dễ dàng: chỉ cần đặt các câu lệnh case bên trong foreach qua dữ liệu thời gian biên dịch và trình biên dịch D sẽ hủy sau đó tối ưu hóa bảng tra cứu cho bạn!

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