Lập trình D - Mẫu
Các mẫu là nền tảng của lập trình chung, liên quan đến việc viết mã theo cách độc lập với bất kỳ kiểu cụ thể nào.
Mẫu là một bản thiết kế hoặc công thức để tạo một lớp hoặc một hàm chung chung.
Mẫu là tính năng cho phép mô tả mã dưới dạng mẫu để trình biên dịch tự động tạo mã chương trình. Các phần của mã nguồn có thể được để cho trình biên dịch điền vào cho đến khi phần đó thực sự được sử dụng trong chương trình. Trình biên dịch điền vào những phần còn thiếu.
Mẫu hàm
Việc xác định một hàm làm khuôn mẫu là để lại một hoặc nhiều kiểu mà nó sử dụng là không xác định, sẽ được trình biên dịch suy ra sau này. Các kiểu không được chỉ định được xác định trong danh sách tham số mẫu, nằm giữa tên của hàm và danh sách tham số hàm. Vì lý do đó, các mẫu hàm có hai danh sách tham số:
- danh sách tham số mẫu
- danh sách tham số chức năng
import std.stdio;
void print(T)(T value) {
writefln("%s", value);
}
void main() {
print(42);
print(1.2);
print("test");
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
42
1.2
test
Mẫu hàm với nhiều tham số loại
Có thể có nhiều loại tham số. Chúng được hiển thị trong ví dụ sau.
import std.stdio;
void print(T1, T2)(T1 value1, T2 value2) {
writefln(" %s %s", value1, value2);
}
void main() {
print(42, "Test");
print(1.2, 33);
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
42 Test
1.2 33
Mẫu lớp
Cũng giống như chúng ta có thể xác định các mẫu hàm, chúng ta cũng có thể xác định các mẫu lớp. Ví dụ sau định nghĩa lớp Stack và thực hiện các phương thức chung để đẩy và bật các phần tử từ ngăn xếp.
import std.stdio;
import std.string;
class Stack(T) {
private:
T[] elements;
public:
void push(T element) {
elements ~= element;
}
void pop() {
--elements.length;
}
T top() const @property {
return elements[$ - 1];
}
size_t length() const @property {
return elements.length;
}
}
void main() {
auto stack = new Stack!string;
stack.push("Test1");
stack.push("Test2");
writeln(stack.top);
writeln(stack.length);
stack.pop;
writeln(stack.top);
writeln(stack.length);
}
Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:
Test2
2
Test1
1