Tôi đã triển khai thư viện nhập động cho D khi tôi gặp phải sự cố thú vị.Sử dụng nhập động trong D, ngôn ngữ được nhập tĩnh
Ngay bây giờ, tôi đã thành công trong việc tạo ra một hàm có tên dynamic()
trả về phiên bản động của một đối tượng.
Ví dụ:
import std.stdio, std.dynamic.core;
class Foo
{
string bar(string a) { return a ~ "OMG"; }
int opUnary(string s)() if (s == "-") { return 0; }
}
void main(string[] argv)
{
Dynamic d = dynamic(new Foo());
Dynamic result = d.bar("hi");
writeln(result); // Uh-oh
}
Vấn đề tôi đã chạy ngang qua là một thực tế rằng writeln
cố gắng sử dụng thời gian biên dịch phản chiếu để tìm ra cách để điều trị result
.
Điều đầu tiên nó cố gắng là gì? isInputRange!(typeof(result))
Vấn đề là, nó trả về đúng! Tại sao? Bởi vì tôi phải giả định rằng tất cả các thành viên mà nó cần tồn tại, trừ khi tôi có thể chứng minh bằng cách khác trong thời gian chạy - đó là quá muộn. Vì vậy, chương trình sẽ cố gắng gọi front
, popFront
và empty
trên result
, làm hỏng chương trình của tôi.
Tôi không thể nghĩ ra cách nào để sửa lỗi này. Có ai có ý tưởng gì không?
'std.variant' không hỗ trợ loại có các lĩnh vực tùy ý. –
@cyber, ý bạn là gì? –
OP muốn tạo một đối tượng trong đó 'obj.anything' hợp lệ tại thời gian biên dịch (mặc dù nó có thể không hợp lệ tại thời gian chạy). Không có gì trong 'std.variant' cho phép điều này, như tôi đã thấy. –