การเขียนโปรแกรม D - ไม่เปลี่ยนรูป
เรามักใช้ตัวแปรที่เปลี่ยนแปลงได้ แต่อาจมีหลายครั้งที่ไม่จำเป็นต้องมีความผันแปร ตัวแปรที่ไม่เปลี่ยนรูปสามารถใช้ได้ในกรณีเช่นนี้ มีตัวอย่างบางส่วนด้านล่างซึ่งสามารถใช้ตัวแปรที่ไม่เปลี่ยนรูปได้
ในกรณีของค่าคงที่ทางคณิตศาสตร์เช่นpiที่ไม่เคยเปลี่ยนแปลง
ในกรณีของอาร์เรย์ที่เราต้องการคงค่าไว้และไม่ใช่ข้อกำหนดของการกลายพันธุ์
ความไม่เปลี่ยนรูปทำให้เข้าใจได้ว่าตัวแปรไม่เปลี่ยนรูปหรือเปลี่ยนแปลงได้หรือไม่โดยรับประกันว่าการดำเนินการบางอย่างจะไม่เปลี่ยนแปลงตัวแปรบางตัว นอกจากนี้ยังลดความเสี่ยงจากข้อผิดพลาดของโปรแกรมบางประเภท แนวคิดความไม่เปลี่ยนรูปของ D แสดงโดยคำหลัก const และไม่เปลี่ยนรูป แม้ว่าทั้งสองคำจะมีความหมายใกล้เคียงกัน แต่ความรับผิดชอบในโปรแกรมจะแตกต่างกันและบางครั้งก็เข้ากันไม่ได้
แนวคิดความไม่เปลี่ยนรูปของ D แสดงโดยคำหลัก const และไม่เปลี่ยนรูป แม้ว่าทั้งสองคำจะมีความหมายใกล้เคียงกัน แต่ความรับผิดชอบในโปรแกรมจะแตกต่างกันและบางครั้งก็เข้ากันไม่ได้
ประเภทของตัวแปรที่ไม่เปลี่ยนรูปใน D
ตัวแปรกำหนดมีสามประเภทที่ไม่มีวันกลายพันธุ์
- ค่าคงที่ของ enum
- ตัวแปรที่ไม่เปลี่ยนรูป
- ตัวแปร const
enumคงที่ใน D
ค่าคงที่ของ enum ทำให้สามารถเชื่อมโยงค่าคงที่กับชื่อที่มีความหมายได้ ตัวอย่างง่ายๆแสดงไว้ด้านล่าง
ตัวอย่าง
import std.stdio;
enum Day{
Sunday = 1,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
void main() {
Day day;
day = Day.Sunday;
if (day == Day.Sunday) {
writeln("The day is Sunday");
}
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
The day is Sunday
ตัวแปรที่ไม่เปลี่ยนรูปใน D
ตัวแปรที่ไม่เปลี่ยนรูปสามารถกำหนดได้ในระหว่างการทำงานของโปรแกรม เพียงแค่สั่งคอมไพเลอร์ว่าหลังจากการเริ่มต้นแล้วมันจะไม่เปลี่ยนรูป ตัวอย่างง่ายๆแสดงไว้ด้านล่าง
ตัวอย่าง
import std.stdio;
import std.random;
void main() {
int min = 1;
int max = 10;
immutable number = uniform(min, max + 1);
// cannot modify immutable expression number
// number = 34;
typeof(number) value = 100;
writeln(typeof(number).stringof, number);
writeln(typeof(value).stringof, value);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
immutable(int)4
immutable(int)100
คุณสามารถดูในตัวอย่างด้านบนว่าเป็นไปได้อย่างไรในการถ่ายโอนประเภทข้อมูลไปยังตัวแปรอื่นและใช้สตริงของขณะพิมพ์
ตัวแปรConstใน D
ไม่สามารถแก้ไขตัวแปร Const ที่คล้ายกับไม่เปลี่ยนรูปได้ ตัวแปรที่ไม่เปลี่ยนรูปสามารถส่งผ่านไปยังฟังก์ชันเป็นพารามิเตอร์ที่ไม่เปลี่ยนรูปได้ดังนั้นจึงขอแนะนำให้ใช้ไม่เปลี่ยนรูปบน const ตัวอย่างเดียวกันกับที่ใช้ก่อนหน้านี้ถูกแก้ไขสำหรับ const ดังที่แสดงด้านล่าง
ตัวอย่าง
import std.stdio;
import std.random;
void main() {
int min = 1;
int max = 10;
const number = uniform(min, max + 1);
// cannot modify const expression number|
// number = 34;
typeof(number) value = 100;
writeln(typeof(number).stringof, number);
writeln(typeof(value).stringof, value);
}
หากเรารวบรวมและเรียกใช้โค้ดด้านบนสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -
const(int)7
const(int)100
พารามิเตอร์ที่ไม่เปลี่ยนรูปใน D
const จะลบข้อมูลเกี่ยวกับว่าตัวแปรดั้งเดิมนั้นเปลี่ยนแปลงได้หรือไม่เปลี่ยนรูปและด้วยเหตุนี้การใช้ไม่เปลี่ยนรูปจึงทำให้มันส่งผ่านฟังก์ชันอื่น ๆ โดยที่ประเภทดั้งเดิมยังคงอยู่ ตัวอย่างง่ายๆแสดงไว้ด้านล่าง
ตัวอย่าง
import std.stdio;
void print(immutable int[] array) {
foreach (i, element; array) {
writefln("%s: %s", i, element);
}
}
void main() {
immutable int[] array = [ 1, 2 ];
print(array);
}
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
0: 1
1: 2