การเขียนโปรแกรม 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