ทับทิมมีบล็อก Python ไม่ได้
Python มีฟังก์ชัน; ทับทิมไม่ได้ ใน Python คุณสามารถใช้ฟังก์ชันหรือวิธีการใดก็ได้และส่งต่อไปยังฟังก์ชันอื่น ใน Ruby ทุกอย่างเป็นวิธีการและไม่สามารถส่งผ่านวิธีการได้โดยตรง แต่คุณต้องห่อไว้ใน Proc เพื่อส่งต่อ
ทั้ง Ruby และ Python รองรับการปิด แต่ต่างกัน ใน Python คุณสามารถกำหนดฟังก์ชันภายในฟังก์ชันอื่นได้ ฟังก์ชันด้านในมีสิทธิ์อ่านตัวแปรจากฟังก์ชันด้านนอก แต่ไม่สามารถเข้าถึงการเขียนได้ ใน Ruby คุณกำหนดการปิดโดยใช้บล็อก การปิดมีสิทธิ์เข้าถึงตัวแปรแบบอ่านและเขียนทั้งหมดจากขอบเขตภายนอก
Python มีความเข้าใจในรายการซึ่งแสดงออกได้ค่อนข้างชัดเจน ตัวอย่างเช่นหากคุณมีรายการตัวเลขคุณสามารถเขียนได้
[x*x for x in values if x > 15]
เพื่อให้ได้รายการใหม่ของค่ากำลังสองของค่าทั้งหมดที่มากกว่า 15 ใน Ruby คุณจะต้องเขียนสิ่งต่อไปนี้:
values.select {|v| v > 15}.map {|v| v * v}
รหัส Ruby ไม่รู้สึกกะทัดรัด นอกจากนี้ยังไม่มีประสิทธิภาพเช่นกันเนื่องจากในครั้งแรกจะแปลงอาร์เรย์ค่าเป็นอาร์เรย์กลางที่สั้นกว่าซึ่งมีค่ามากกว่า 15 จากนั้นจะใช้อาร์เรย์กลางและสร้างอาร์เรย์สุดท้ายที่มีกำลังสองของตัวกลาง จากนั้นอาร์เรย์กลางจะถูกโยนออกไป ดังนั้น Ruby จึงลงเอยด้วย 3 อาร์เรย์ในหน่วยความจำระหว่างการคำนวณ Python ต้องการเฉพาะรายการอินพุตและรายการผลลัพธ์
Python ยังให้ความเข้าใจแผนที่ที่คล้ายกัน
Python รองรับ tuples; ทับทิมไม่ได้ ใน Ruby คุณต้องใช้อาร์เรย์เพื่อจำลองสิ่งทูเปิล
Ruby รองรับคำสั่ง switch / case; Python ไม่ได้
Ruby รองรับตัวexpr ? val1 : val2
ดำเนินการ ternary มาตรฐาน Python ไม่ได้
Ruby รองรับการสืบทอดเดียวเท่านั้น หากคุณต้องการเลียนแบบการสืบทอดหลายรายการคุณสามารถกำหนดโมดูลและใช้มิกซ์อินเพื่อดึงวิธีการของโมดูลเข้าสู่คลาส Python รองรับการสืบทอดหลายรายการแทนที่จะเป็นโมดูลมิกซ์อิน
Python รองรับฟังก์ชันแลมด้าบรรทัดเดียวเท่านั้น บล็อก Ruby ซึ่งเป็นฟังก์ชันแลมบ์ดา / ประเภทสามารถมีขนาดใหญ่ได้ตามอำเภอใจ ด้วยเหตุนี้รหัส Ruby จึงมักเขียนในรูปแบบที่ใช้งานได้ดีกว่ารหัส Python ตัวอย่างเช่นในการวนซ้ำรายการใน Ruby คุณมักจะทำ
collection.each do |value|
...
end
collection.each
บล็อกการทำงานอย่างมากเช่นฟังก์ชั่นที่ถูกส่งผ่านไปยัง หากคุณจะทำสิ่งเดียวกันใน Python คุณจะต้องกำหนดฟังก์ชันภายในที่มีชื่อแล้วส่งต่อไปยังคอลเลกชันแต่ละวิธี (หากรายการรองรับวิธีนี้):
def some_operation(value):
...
collection.each(some_operation)
ที่ไม่ไหลลื่นมาก ดังนั้นโดยทั่วไปแล้ววิธีการที่ไม่ใช้งานต่อไปนี้จะถูกใช้ใน Python:
for value in collection:
...
การใช้ทรัพยากรอย่างปลอดภัยนั้นค่อนข้างแตกต่างกันระหว่างสองภาษา ที่นี่ปัญหาคือคุณต้องการจัดสรรทรัพยากรบางอย่าง (เปิดไฟล์รับเคอร์เซอร์ฐานข้อมูล ฯลฯ ) ดำเนินการตามอำเภอใจจากนั้นปิดอย่างปลอดภัยแม้ว่าจะมีข้อยกเว้นเกิดขึ้นก็ตาม
ใน Ruby เนื่องจากบล็อกใช้งานง่ายมาก (ดู # 9) โดยทั่วไปคุณจะเขียนโค้ดรูปแบบนี้เป็นวิธีการที่ใช้บล็อกสำหรับการดำเนินการโดยพลการเพื่อดำเนินการกับทรัพยากร
ใน Python การส่งผ่านฟังก์ชั่นสำหรับการกระทำโดยพลการนั้นมีความซับซ้อนกว่าเล็กน้อยเนื่องจากคุณต้องเขียนชื่อฟังก์ชันภายใน (ดู # 9) Python ใช้with
คำสั่งเพื่อความปลอดภัยในการจัดการทรัพยากร ดูฉันจะล้างวัตถุ Python อย่างถูกต้องได้อย่างไร สำหรับรายละเอียดเพิ่มเติม