สิ่งใดที่คุณมีเคล็ดลับทั่วไปสำหรับการเล่นกอล์ฟในD ? ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะเจาะจงกับ D (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
สิ่งใดที่คุณมีเคล็ดลับทั่วไปสำหรับการเล่นกอล์ฟในD ? ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหารหัสกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะเจาะจงกับ D (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ
คำตอบ:
ดูสิไม่มีคำอุปมา!
ฟังก์ชันของ D และฟังก์ชันเทมเพลตสามารถเรียกได้ว่าเป็นค่าวิธีการ (ไม่ช่วย) และคุณสมบัติ
ฉันไม่อยากเชื่อเลยว่าจะไม่มีใครพูดเรื่องนี้ ฉันจะแสดงรายการที่บันทึกไบต์:
fun()
และfun!()()
ย่อให้สั้นลงfun
(สมมติว่าไม่มีตัวแปรfun
)fun(par)
ย่อให้สั้นลงpar.fun
(สมมติว่าpar
ไม่มีคุณสมบัติ / วิธีการfun
รวมทั้งpar
ไม่มีการแสดงออกเช่นนี้5+2
)fun!(T)()
ย่อให้เป็น fun!T
fun!(T)(par)
ย่อให้เป็นpar.fun!T
(สมมติว่าpar
ไม่มีคุณสมบัติ / วิธีการfun
)และด้วยวัตถุ:
new cls()
ย่อให้เหลือnew cls
(มี JavaScript เพิ่มเติมหรือไม่)obj.fun()
และobj.fun!()()
ย่อให้สั้นลงobj.fun
obj.fun!(T)()
ย่อให้เป็น obj.fun!T
สิ่งหนึ่งที่สุดท้ายใช้รุ่นเก่า ช่วยให้คุณใช้คุณสมบัติที่เลิกใช้แล้วซึ่งทำให้รหัสของคุณสั้นลง ที่กล่าวว่าคำแนะนำที่ดีที่สุด: D ไม่ดีสำหรับรหัสกอล์ฟ มันเป็นภาษาที่ยอดเยี่ยมไม่ใช่สำหรับรหัส - กอล์ฟ
D คือ JavaScript
เห็นได้ชัดว่าไม่ แต่เมื่อต้องรับมือกับfloat
, double
และreal
, nan
เป็นค่าซึ่งจะต้องได้รับการจัดการและตามที่ระบุโดย IEEE 754 น่านไม่ได้เปรียบเทียบที่เท่าเทียมกันกับตัวเอง
writeln(double.nan == double.nan); // false
ความหมาย
writeln(value!=value); // only true for nan
สั้นกว่า
import std.math;
writeln(isNaN(value));
เห็นได้ชัดว่ามักจะใช้math.isNaN
สำหรับจริงรหัส ;)
D มีการอนุมานประเภทและauto
คำหลัก หากวัตถุไม่ได้แสดงint
ว่าauto
อาจสั้นลง
auto
ทำงานเมื่อมีการสร้างอาเรย์กับKeyType[ValueType]
ไวยากรณ์?
auto asd = ["a":1, "b": 2];
ทำงานได้ แต่เนื่องจากKeyType[ValueType]
จะไปแทนที่auto
คำหลักฉันไม่ทราบว่าจะทำงานกับประเภทที่ตัวอักษรไม่สามารถสร้างได้เสมอ
auto arr = ["a": true, "b": 6];
ทำงานได้คีย์และค่าจะต้องเป็นประเภทที่เข้ากันได้
D เป็นวิธีการผูกมัดที่ยอดเยี่ยม แต่:
str.toLower.strip().split("").sort();
เป็นเช่นเดียวกับ
sort(split(strip(str.toLower),""));
และโดยปกติแล้วคนที่ไม่ถูกผูกมัดจะสั้นกว่าซึ่งฉันเพิ่งรู้ซึ่งทำให้ฉันสั้นลงคำตอบของฉันเพื่อจัดการถังขยะดังนั้น : D
เช่น C / C ++ main
สามารถเป็นint
หรือvoid
แต่void main(){}
จะสั้นกว่าint main(){return my_func_returning_int;}
เสมอ
int main(){return output}
สั้นลง?
import std.stdio;void main(){write(7);}
เป็นสิ่งที่จำเป็น ฉันสงสัยว่าคำถามจะมอบอำนาจให้โปรแกรมส่งคืนตัวเลขเนื่องจากหลายภาษาไม่สามารถตั้งรหัสส่งคืนได้
D ในฐานะภาษาการเขียนโปรแกรมระบบหลายภาษา (Object Functional) ดูเหมือนว่าจะยอมรับ TIMTOWTDI หรือมีมากกว่าหนึ่งวิธีที่ต้องทำ
ตรงจุดเขียน argv ของโปรแกรม:
import std.stdio, std.array, std.algorithm;
void main(string[] args) {
for(int i=0;i<args.length;writeln(args[i++])){};
foreach(a;args)writeln(a);
each!writeln(args);
}
โปรดสังเกตว่า C-style for-loop ต้องการ{}
บล็อกว่างเปล่าและจะไม่ยอมรับเซมิโคลอนหรือไม่มีอะไรเป็นคำสั่งว่างในกรณีนี้ โดยปกติหรือ
;
ไม่มี ops
char*
แทนstring
การบันทึกไบต์ได้หรือไม่?
function D main parameters must be main() or main(string[] args)
ยิ่งไปกว่านั้นchar
ก็คือตัวอักษรตัวหนึ่งchar*
เป็นตัวชี้ไปที่ตัวอักษรหนึ่งตัวอักษรและchar[]
เป็นอาร์เรย์ของตัวอักษรตัวอักษร (สตริงจะแตกต่างกัน) D! = C || C ++
D มีรูปแบบแลมบ์ดา C #-style ไม่กี่แบบซึ่งสามารถกำหนดและยืนอยู่คนเดียว:
(int a,int b)=>a*b;
auto a=(int a,int b)=>a*b;
อย่างไรก็ตามแตกต่างจาก C #, ประเภทของลายเซ็นยังคงมีความจำเป็นเพราะ D ไม่ได้มีการอนุมานประเภทระดับ Haskell
T f(T)(T a,T b){return a + b}
ควรอนุมานTว่าint inf(5);
การเรียกฟังก์ชันบนวัตถุที่ไม่มีอาร์กิวเมนต์อื่น
reverse(x);
สามารถตัดให้สั้นลงได้เสมอ
x.reverse;
เพื่อโกนเป็นไบต์หรือมากกว่านั้น
นี่เป็นเพราะการ.
ทำให้ LHS เป็นอาร์กิวเมนต์แรกโดยปริยายและการสร้างเทมเพลตให้เราเลือกฟังก์ชันที่เหมาะสมสำหรับ args
x.reverse(y, z)
ต่อไปความยาวจะเกิดขึ้นเนื่องจากจุด
x.reverse(y,z)
และreverse(x,y,z)
มีจำนวนไบต์เดียวกัน
x.reverse(y, z)
กับx.reverse
หรือยัง
หากคำถามนั้นต้องการโปรแกรมเต็มรูปแบบการmodule
ประกาศนั้นไม่จำเป็นอย่างน่าประหลาดใจ
* ไอ * Java ทุกคน? * ล้างคอ * จริงๆแล้วmodule
ระบบของ D นั้นเก่ากว่าของ Java