Tôi đang đọc "Ngôn ngữ lập trình D" của Andrei Alexandrescu và một câu làm tôi bối rối. Hãy xem xét mã như vậy (p.138):Điều gì là sai với loại suy luận của mẫu và chuyển đổi loại tiềm ẩn?
T[] find(T)(T[] haystack, T needle) {
while (haystack.length > 0 && haystack[0] != needle) {
haystack = haystack[1 .. $];
}
return haystack;
}
và gọi số (p.140):
double[] a = [ 1.0, 2.5, 2.0, 3.4 ];
a = find(a, 2); // Error! ' find(double[], int)' undefined
Giải thích (đoạn mã dưới đây):
Nếu chúng ta nheo mắt cứng đủ , chúng tôi thấy rằng mục đích của người gọi trong trường hợp này là có
T = double
và được hưởng lợi từ chuyển đổi tiềm ẩn tốt đẹp từint
thànhdouble
. Tuy nhiên, có sự cố gắng ngôn ngữ hợp tác cùng lúc với các chuyển đổi tiềm ẩn và loại khấu trừ là một đề xuất dicey trong trường hợp chung, vì vậy D không cố gắng làm tất cả những điều đó.
Tôi đang bối rối vì ngôn ngữ như C# cố gắng suy ra loại - nếu nó không thể làm điều này, người dùng bị lỗi, nhưng nếu nó có thể, tốt, nó hoạt động. C# sống với nó trong nhiều năm và tôi không nghe thấy bất kỳ câu chuyện làm thế nào tính năng này hủy hoại ngày của ai đó.
Và vì vậy câu hỏi của tôi là điều này - những mối nguy hiểm nào có liên quan đến việc suy ra các loại như trong ví dụ trên?
Tôi chỉ có thể thấy những lợi thế, thật dễ dàng để viết hàm chung và dễ gọi nó. Nếu không, bạn sẽ phải giới thiệu nhiều tham số hơn trong lớp/hàm chung chung và viết các ràng buộc đặc biệt thể hiện chuyển đổi được phép chỉ vì lợi ích của việc suy ra các loại.
Ở trên dường như chạy tốt trong 'dmd 2.066'. Tôi đoán họ đã quyết định rằng mệnh đề không phải là 'xúc xắc' như họ nghĩ. – rcorre
Tính năng này đã được giới thiệu khoảng một năm trước trong PR này: https://github.com/D-Programming-Language/dmd/pull/3353 –