การเขียนโปรแกรม D - Mixins

Mixins เป็นโครงสร้างที่อนุญาตให้ผสมรหัสที่สร้างขึ้นลงในซอร์สโค้ด Mixins สามารถเป็นประเภทต่อไปนี้ -

  • สตริงมิกซ์
  • เทมเพลตมิกซ์อิน
  • ช่องว่างชื่อมิกซ์

สตริงมิกซ์

D มีความสามารถในการแทรกโค้ดเป็นสตริงตราบเท่าที่สตริงนั้นเป็นที่รู้จักในเวลาคอมไพล์ ไวยากรณ์ของสตริงผสมแสดงไว้ด้านล่าง -

mixin (compile_time_generated_string)

ตัวอย่าง

ตัวอย่างง่ายๆสำหรับสตริงมิกซ์แสดงอยู่ด้านล่าง

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

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -

Hello World!

นี่คืออีกตัวอย่างหนึ่งที่เราสามารถส่งสตริงในเวลาคอมไพล์เพื่อให้มิกซ์อินสามารถใช้ฟังก์ชันเพื่อใช้โค้ดซ้ำได้ ดังแสดงด้านล่าง

import std.stdio;

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

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -

str1
str2

เทมเพลตมิกซ์อิน

เทมเพลต D กำหนดรูปแบบโค้ดทั่วไปเพื่อให้คอมไพลเลอร์สร้างอินสแตนซ์จริงจากรูปแบบนั้น เทมเพลตสามารถสร้างฟังก์ชันโครงสร้างสหภาพคลาสอินเทอร์เฟซและรหัส D ทางกฎหมายอื่น ๆ ไวยากรณ์ของเทมเพลตมิกซ์อินดังที่แสดงด้านล่าง

mixin a_template!(template_parameters)

ตัวอย่างง่ายๆสำหรับการผสมสตริงแสดงอยู่ด้านล่างซึ่งเราสร้างเทมเพลตด้วยแผนกคลาสและมิกซ์อินอินสแตนซ์เทมเพลตและด้วยเหตุนี้จึงทำให้ฟังก์ชัน setName และ printNames พร้อมใช้งานสำหรับวิทยาลัยโครงสร้าง

ตัวอย่าง

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(); 
}

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -

The names 
0 : name1 
1 : name2

Mixin Name Spaces

ช่องว่างชื่อ Mixin ใช้เพื่อหลีกเลี่ยงความคลุมเครือในเทมเพลตมิกซ์อิน ตัวอย่างเช่นอาจมีตัวแปร 2 ตัวตัวหนึ่งกำหนดไว้อย่างชัดเจนใน main และอีกตัวผสมกันเมื่อชื่อแบบผสมเหมือนกับชื่อที่อยู่ในขอบเขตโดยรอบชื่อที่อยู่ในขอบเขตโดยรอบจะได้รับ ใช้แล้ว ตัวอย่างนี้แสดงไว้ด้านล่าง

ตัวอย่าง

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(); 
}

เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานโค้ดจะได้ผลลัพธ์ดังนี้ -

name 1 
name 2