คำถามติดแท็ก language-design

แท็กสำหรับคำถามที่เกี่ยวข้องกับการออกแบบทุกแง่มุมของภาษาโปรแกรม

8
เหตุใดอาร์เรย์ของโควาเรียนท์ แต่ยาสามัญมีค่าคงที่?
จาก Java ที่มีประสิทธิภาพโดย Joshua Bloch อาร์เรย์แตกต่างจากประเภททั่วไปในสองวิธีที่สำคัญ อาร์เรย์แรกเป็น covariant ยาสามัญมีค่าคงที่ Covariant นั้นหมายถึงว่าถ้า X เป็นชนิดย่อยของ Y ดังนั้น X [] ก็จะเป็นประเภทย่อยของ Y [] อาร์เรย์เป็น covariant เนื่องจากสตริงเป็นชนิดย่อยของ Object So String[] is subtype of Object[] ค่าคงที่นั้นหมายถึงโดยไม่คำนึงว่า X เป็นชนิดย่อยของ Y หรือไม่ List<X> will not be subType of List<Y>. คำถามของฉันคือทำไมการตัดสินใจที่จะทำให้อาร์เรย์ covariant ใน Java? มีการโพสต์ SO อื่น ๆ …

10
เหตุใดเขตข้อมูลส่วนตัวจึงเป็นประเภทส่วนตัวไม่ใช่เช่นนั้น
ใน C # (และภาษาอื่น ๆ อีกมากมาย) การเข้าใช้ฟิลด์ส่วนตัวของอินสแตนซ์อื่นประเภทเดียวกันนั้นถูกต้องตามกฎหมาย ตัวอย่างเช่น: public class Foo { private bool aBool; public void DoBar(Foo anotherFoo) { if (anotherFoo.aBool) ... } } เนื่องจากข้อกำหนดC # (ส่วน 3.5.1, 3.5.2) ระบุว่าการเข้าถึงฟิลด์ส่วนตัวอยู่ในประเภทไม่ใช่อินสแตนซ์ ฉันกำลังคุยเรื่องนี้กับเพื่อนร่วมงานและเรากำลังพยายามหาเหตุผลว่าทำไมมันถึงใช้งานได้ (แทนที่จะ จำกัด การเข้าถึงอินสแตนซ์เดียวกัน) อาร์กิวเมนต์ที่ดีที่สุดที่เราสามารถหาได้คือการตรวจสอบความเท่าเทียมกันซึ่งคลาสอาจต้องการเข้าถึงฟิลด์ส่วนตัวเพื่อกำหนดความเท่าเทียมกันกับอินสแตนซ์อื่น มีเหตุผลอื่นอีกไหม? หรือเหตุผลทองบางอย่างที่หมายความว่ามันต้องทำงานอย่างนี้หรือบางสิ่งจะเป็นไปไม่ได้อย่างสมบูรณ์?


5
ทำไม Java ไม่อนุญาตให้มีคลาสย่อยทั่วไปของ Throwable
ตามการแยกภาษา Javaรุ่นที่ 3: มันเป็นข้อผิดพลาดเวลารวบรวมถ้าระดับทั่วไปเป็น subclass Throwableโดยตรงหรือโดยอ้อมของ ฉันต้องการเข้าใจว่าทำไมการตัดสินใจครั้งนี้จึงเกิดขึ้น เกิดอะไรขึ้นกับข้อยกเว้นทั่วไป (เท่าที่ฉันรู้ generics เป็นเพียงการรวบรวมเวลา syntactic น้ำตาลและพวกเขาจะถูกแปลเป็นObjectอย่างไรก็ตามใน.classไฟล์ดังนั้นการประกาศคลาสทั่วไปอย่างมีประสิทธิภาพราวกับว่าทุกอย่างในนั้นเป็นObjectโปรดแก้ไขให้ฉันถ้าฉันผิด .)

11
ทำไม Lua ถึงไม่มีคำสั่ง“ ต่อ”?
ฉันติดต่อกับ Lua เป็นอย่างมากในช่วงไม่กี่เดือนที่ผ่านมาและฉันชอบคุณสมบัติส่วนใหญ่ แต่ฉันก็ยังขาดอะไรบางอย่างอยู่: ทำไมถึงไม่มีcontinue? มีวิธีแก้ปัญหาอะไรบ้าง

7
ทำไมทับทิมถึงมีทั้งแบบส่วนตัวและแบบป้องกัน?
ก่อนที่ฉันจะอ่านบทความนี้ฉันคิดว่าการควบคุมการเข้าถึงใน Ruby ทำงานเช่นนี้: public- สามารถเข้าถึงได้โดยวัตถุใด ๆ (เช่นObj.new.public_method) protected - สามารถเข้าถึงได้จากภายในวัตถุเท่านั้นเช่นเดียวกับคลาสย่อยใด ๆ private - เช่นเดียวกับที่ได้รับการป้องกัน แต่ไม่มีวิธีการในคลาสย่อย อย่างไรก็ตามดูเหมือนว่าprotectedและprivateปฏิบัติเช่นเดียวกันยกเว้นความจริงที่ว่าคุณไม่สามารถเรียกprivateวิธีการด้วยผู้รับที่ชัดเจน (เช่นใช้self.protected_methodงานได้ แต่self.private_methodไม่ได้) ประเด็นนี้คืออะไร? เมื่อใดจะมีสถานการณ์เมื่อคุณไม่ต้องการวิธีการของคุณที่เรียกด้วยผู้รับที่ชัดเจน?

4
เหตุใดตัวแปรโลคอลจึงต้องมีการเริ่มต้น แต่ฟิลด์ทำไม่ได้?
ถ้าฉันสร้างบูลในชั้นเรียนของฉันbool checkมันก็เหมือนกับค่าเริ่มต้นที่เป็นเท็จ เมื่อฉันสร้างบูลเดียวกันภายในเมธอดของฉันbool check(แทนที่จะเป็นคลาส) ฉันได้รับข้อผิดพลาด "ใช้การตรวจสอบตัวแปรโลคอลที่ไม่ได้กำหนด" ทำไม?

24
ทำไมชื่อตัวแปรเริ่มต้นด้วยตัวเลขไม่ได้?
ฉันทำงานกับนักพัฒนา C ++ รายใหม่เมื่อเขาถามคำถาม: "ทำไมชื่อตัวแปรไม่สามารถขึ้นต้นด้วยตัวเลข" ฉันไม่สามารถหาคำตอบได้ยกเว้นว่าตัวเลขบางตัวสามารถมีข้อความอยู่ในนั้น (123456L, 123456U) และจะเป็นไปไม่ได้หากคอมไพเลอร์คิดทุกอย่างด้วยอักขระอัลฟ่าจำนวนหนึ่งเป็นชื่อตัวแปร นั่นคือคำตอบที่ถูกต้องหรือไม่? มีเหตุผลอะไรอีกไหม? string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

9
เหตุใดคำสั่งสวิตช์จึงถูกออกแบบมาเพื่อให้หยุดพัก
รับงบสวิตช์ง่าย switch (int) { case 1 : { printf("1\n"); break; } case 2 : { printf("2\n"); } case 3 : { printf("3\n"); } } การขาดคำสั่ง break ในกรณีที่ 2 หมายความว่าการดำเนินการจะดำเนินการต่อภายในรหัสสำหรับกรณีที่ 3 นี่ไม่ใช่อุบัติเหตุ มันถูกออกแบบมาอย่างนั้น เหตุใดการตัดสินใจนี้จึงเกิดขึ้น สิ่งนี้มีประโยชน์อะไรเมื่อเทียบกับการมี semantic break อัตโนมัติสำหรับบล็อก เหตุผลคืออะไร
139 c  language-design 

28
เหตุใดจึงไม่มีการประกาศตัวแปรใน“ ลอง” ในขอบเขตใน“ จับ” หรือ“ ในที่สุด”?
ใน C # และใน Java (และภาษาอื่น ๆ ด้วย) ตัวแปรที่ประกาศในบล็อก "ลอง" ไม่ได้อยู่ในขอบเขตในบล็อก "catch" หรือ "สุดท้าย" ที่สอดคล้องกัน ตัวอย่างเช่นรหัสต่อไปนี้ไม่ได้รวบรวม: try { String s = "test"; // (more code...) } catch { Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead } ในรหัสนี้ข้อผิดพลาดเวลาคอมไพล์เกิดขึ้นในการอ้างอิงถึง s ใน catch block เนื่องจาก s อยู่ในขอบเขตในลองบล็อกเท่านั้น (ใน Java ข้อผิดพลาดในการคอมไพล์คือ "s ไม่สามารถแก้ไขได้" ใน …

10
ทำไมหลาม dict.update () ไม่คืนวัตถุ?
ฉันพยายามทำ: award_dict = { "url" : "http://facebook.com", "imageurl" : "http://farm4.static.flickr.com/3431/3939267074_feb9eb19b1_o.png", "count" : 1, } def award(name, count, points, desc_string, my_size, parent) : if my_size > count : a = { "name" : name, "description" : desc_string % count, "points" : points, "parent_award" : parent, } a.update(award_dict) return self.add_award(a, siteAlias, alias).award …

13
เหตุใด C ++ จึงต้องการไฟล์ส่วนหัวแยกต่างหาก
ฉันไม่เคยเข้าใจเลยว่าทำไม C ++ จึงต้องการไฟล์ส่วนหัวแยกต่างหากซึ่งมีฟังก์ชั่นเดียวกับในไฟล์. cpp มันทำให้การสร้างคลาสและการปรับโครงสร้างใหม่นั้นยากมากและจะเพิ่มไฟล์ที่ไม่จำเป็นให้กับโครงการ แล้วมีปัญหากับการรวมไฟล์ส่วนหัว แต่ต้องตรวจสอบอย่างชัดเจนว่าได้รวมอยู่แล้วหรือไม่ C ++ ได้รับการให้สัตยาบันในปี 1998 ดังนั้นทำไมมันจึงออกแบบวิธีนี้ ข้อดีของการมีไฟล์ส่วนหัวแยกกันคืออะไร ติดตามคำถาม: คอมไพเลอร์หาไฟล์. cpp ด้วยรหัสในวิธีใดเมื่อฉันรวมเป็นไฟล์. h มันสันนิษฐานว่าไฟล์. cpp มีชื่อเดียวกันกับไฟล์. h หรือไม่จริง ๆ แล้วค้นหาไฟล์ทั้งหมดในแผนผังไดเรกทอรีหรือไม่

9
เหตุใด Ruby จึงไม่รองรับ i ++ หรือ i - (ตัวดำเนินการเพิ่ม / ลด)
ตัวดำเนินการเพิ่ม / ลดก่อน / หลัง ( ++และ--) เป็นไวยากรณ์ภาษาโปรแกรมมาตรฐานที่ค่อนข้างดี (สำหรับภาษาขั้นตอนและภาษาเชิงวัตถุอย่างน้อย) ทำไม Ruby ถึงไม่สนับสนุนพวกเขา? ฉันเข้าใจว่าคุณสามารถทำในสิ่งเดียวกันได้ด้วย+=และ-=แต่มันก็ดูเป็นเรื่องแปลกที่จะไม่รวมบางสิ่งเช่นนั้นโดยพลการโดยเฉพาะอย่างยิ่งเนื่องจากมันกระชับและเป็นแบบแผน ตัวอย่าง: i = 0 #=> 0 i += 1 #=> 1 i #=> 1 i++ #=> expect 2, but as far as I can tell, #=> irb ignores the second + and waits for a second number …

9
เหตุใดคำสั่ง String switch จึงไม่รองรับกรณีว่าง
ฉันแค่สงสัยว่าทำไมswitchคำสั่งJava 7 ไม่รองรับnullเคสและโยนแทนNullPointerException? ดูบรรทัดแสดงความคิดเห็นด้านล่าง (ตัวอย่างจากบทความ Java Tutorials บนswitch ): { String month = null; switch (month) { case "january": monthNumber = 1; break; case "february": monthNumber = 2; break; case "march": monthNumber = 3; break; //case null: default: monthNumber = 0; break; } return monthNumber; } สิ่งนี้จะหลีกเลี่ยงifเงื่อนไขสำหรับการตรวจสอบค่าว่างก่อนการswitchใช้งานทุกครั้ง

8
เหตุใดฟังก์ชันอินไลน์ของ C ++ จึงอยู่ในส่วนหัว
หมายเหตุนี่ไม่ใช่คำถามเกี่ยวกับวิธีการใช้ฟังก์ชันแบบอินไลน์หรือวิธีการทำงานอีกต่อไปว่าทำไมพวกเขาถึงทำในแบบที่เป็นอยู่ การประกาศฟังก์ชันสมาชิกคลาสไม่จำเป็นต้องกำหนดฟังก์ชันเนื่องจากinlineเป็นเพียงการนำฟังก์ชันไปใช้งานจริงเท่านั้น ตัวอย่างเช่นในไฟล์ส่วนหัว: struct foo{ void bar(); // no need to define this as inline } เหตุใดการใช้ฟังก์ชันคลาสแบบอินไลน์จึงต้องอยู่ในไฟล์ส่วนหัว? เหตุใดฉันจึงไม่สามารถใส่ฟังก์ชันอินไลน์ใน.cppไฟล์ได้ ถ้าฉันพยายามใส่คำจำกัดความแบบอินไลน์ใน.cppไฟล์ฉันจะได้รับข้อผิดพลาดตามบรรทัดของ: error LNK2019: unresolved external symbol "public: void __thiscall foo::bar(void)" (?bar@foo@@QAEXXZ) referenced in function _main 1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe : fatal error LNK1120: 1 unresolved externals

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.