Lập trình D - Mixin

Mixin là cấu trúc cho phép trộn mã đã tạo vào mã nguồn. Mixin có thể thuộc các loại sau:

  • Chuỗi mixin
  • Mixin mẫu
  • Khoảng trắng tên trộn

Chuỗi mixin

D có khả năng chèn mã dưới dạng chuỗi miễn là chuỗi đó được biết tại thời điểm biên dịch. Cú pháp của chuỗi mixin được hiển thị bên dưới:

mixin (compile_time_generated_string)

Thí dụ

Dưới đây là một ví dụ đơn giản cho các mixin chuỗi.

import std.stdio; 
 
void main() { 
   mixin(`writeln("Hello World!");`); 
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Hello World!

Đây là một ví dụ khác mà chúng ta có thể chuyển chuỗi trong thời gian biên dịch để các mixin có thể sử dụng các hàm để sử dụng lại mã. Nó được hiển thị bên dưới.

import std.stdio;

string print(string s) {
   return `writeln("` ~ s ~ `");`; 
}
  
void main() { 
   mixin (print("str1")); 
   mixin (print("str2")); 
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

str1
str2

Mixin mẫu

Các mẫu D xác định các mẫu mã chung, để trình biên dịch tạo ra các phiên bản thực tế từ mẫu đó. Các mẫu có thể tạo ra các hàm, cấu trúc, hợp nhất, lớp, giao diện và bất kỳ mã D hợp pháp nào khác. Cú pháp của mixin mẫu như được hiển thị bên dưới.

mixin a_template!(template_parameters)

Một ví dụ đơn giản cho các mixin chuỗi được hiển thị bên dưới, trong đó chúng tôi tạo một mẫu với Bộ phận lớp và một mixin khởi tạo một mẫu và do đó làm cho các hàm setName và printNames có sẵn cho trường cấu trúc.

Thí dụ

import std.stdio;

template Department(T, size_t count) { 
   T[count] names;  
   void setName(size_t index, T name) { 
      names[index] = name; 
   } 
   
   void printNames() { 
      writeln("The names");  
      
      foreach (i, name; names) { 
         writeln(i," : ", name); 
      }
   }
}
 
struct College { 
   mixin Department!(string, 2); 
}
  
void main() { 
   auto college = College();  
   college.setName(0, "name1"); 
   college.setName(1, "name2");  
   college.printNames(); 
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

The names 
0 : name1 
1 : name2

Mixin Name Spaces

Khoảng trắng tên mixin được sử dụng để tránh sự mơ hồ trong các mixin mẫu. Ví dụ: có thể có hai biến, một biến được xác định rõ ràng trong main và biến còn lại được trộn vào. Khi một tên hỗn hợp giống với tên trong phạm vi xung quanh, thì tên trong phạm vi xung quanh sẽ được đã sử dụng. Ví dụ này được hiển thị bên dưới.

Thí dụ

import std.stdio;

template Person() { 
   string name; 
   
   void print() { 
      writeln(name); 
   } 
}

void main() { 
   string name; 
   
   mixin Person a; 
   name = "name 1"; 
   writeln(name); 
   
   a.name = "name 2"; 
   print(); 
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

name 1 
name 2