คำถามติดแท็ก default-parameters

30
“ ความประหลาดใจน้อยที่สุด” และอาร์กิวเมนต์เริ่มต้นที่เปลี่ยนแปลงได้
ทุกคนที่มี Python นานพอถูกกัด (หรือฉีกเป็นชิ้น ๆ ) โดยปัญหาต่อไปนี้: def foo(a=[]): a.append(5) return a [5]สามเณรงูใหญ่คาดว่าจะได้ฟังก์ชั่นนี้เสมอกลับรายการที่มีเพียงองค์ประกอบหนึ่ง: ผลลัพธ์จะแตกต่างกันมากและน่าประหลาดใจมาก (สำหรับมือใหม่): >>> foo() [5] >>> foo() [5, 5] >>> foo() [5, 5, 5] >>> foo() [5, 5, 5, 5] >>> foo() ผู้จัดการของฉันเคยพบกับคุณสมบัตินี้ครั้งแรกและเรียกมันว่า "ข้อบกพร่องในการออกแบบที่น่าทึ่ง" ของภาษา ฉันตอบว่าพฤติกรรมนั้นมีคำอธิบายพื้นฐานและเป็นเรื่องที่ทำให้งงงวยและคาดไม่ถึงถ้าคุณไม่เข้าใจ internals อย่างไรก็ตามฉันไม่สามารถตอบคำถามต่อไปนี้ (กับตัวเอง): อะไรคือเหตุผลในการเชื่อมอาร์กิวเมนต์เริ่มต้นที่คำจำกัดความของฟังก์ชั่นและไม่ทำงานในการดำเนินการ? ฉันสงสัยว่าพฤติกรรมที่มีประสบการณ์นั้นมีประโยชน์ในทางปฏิบัติ (ใครใช้ตัวแปรคงที่ใน C โดยไม่ต้องปรับปรุงบั๊ก) แก้ไข : Baczek …

26
ตั้งค่าพารามิเตอร์เริ่มต้นสำหรับฟังก์ชั่น JavaScript
ฉันต้องการให้ฟังก์ชัน JavaScript มีอาร์กิวเมนต์ที่เป็นทางเลือกซึ่งฉันตั้งเป็นค่าเริ่มต้นซึ่งจะถูกใช้หากไม่ได้กำหนดค่า (และจะข้ามหากค่านั้นผ่านไป) ใน Ruby คุณสามารถทำสิ่งนี้ได้: def read_file(file, delete_after = false) # code end ใช้งานได้กับ JavaScript หรือไม่ function read_file(file, delete_after = false) { // Code }

23
Java รองรับค่าพารามิเตอร์เริ่มต้นหรือไม่
ฉันเจอโค้ด Java บางตัวที่มีโครงสร้างต่อไปนี้: public MyParameterizedFunction(String param1, int param2) { this(param1, param2, false); } public MyParameterizedFunction(String param1, int param2, boolean param3) { //use all three parameters here } ฉันรู้ว่าใน C ++ ฉันสามารถกำหนดพารามิเตอร์เป็นค่าเริ่มต้น ตัวอย่างเช่น: void MyParameterizedFunction(String param1, int param2, bool param3=false); Java รองรับไวยากรณ์ประเภทนี้หรือไม่ มีเหตุผลใดบ้างที่ทำให้ไวยากรณ์สองขั้นตอนนี้เป็นที่ต้องการมากกว่า


4
T-SQL - ฟังก์ชันพร้อมพารามิเตอร์เริ่มต้น
ฉันมีสคริปต์นี้: CREATE FUNCTION dbo.CheckIfSFExists(@param1 INT, @param2 BIT = 1 ) RETURNS BIT AS BEGIN IF EXISTS ( bla bla bla ) RETURN 1; RETURN 0; END GO ฉันต้องการใช้ในขั้นตอนด้วยวิธีนี้: IF dbo.CheckIfSFExists( 23 ) = 0 SET @retValue = 'bla bla bla'; แต่ฉันได้รับข้อผิดพลาด: มีการระบุจำนวนอาร์กิวเมนต์ไม่เพียงพอสำหรับโพรซีเดอร์หรือฟังก์ชัน dbo.CheckIfSFExists ทำไมมันไม่ทำงาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.