OP เขียน
ดูเหมือนว่าจะแปลกสำหรับฉันที่โครงสร้างข้างต้นไม่ได้ผลลัพธ์ที่คาดหวัง อะไรคือเหตุผลสำหรับสิ่งนั้น? อะไรคือสถานการณ์เมื่อพฤติกรรมนี้สมเหตุสมผล?
ไม่สามารถทำได้หรือไม่ แต่เพื่อตอบคำถามที่ไม่ได้ถามก่อนที่จะไปถึงคำถามที่ถามจริง:
$ irb
2.1.5 :001 > (0..4)
=> 0..4
2.1.5 :002 > (0..4).each { |i| puts i }
0
1
2
3
4
=> 0..4
2.1.5 :003 > (4..0).each { |i| puts i }
=> 4..0
2.1.5 :007 > (0..4).reverse_each { |i| puts i }
4
3
2
1
0
=> 0..4
2.1.5 :009 > 4.downto(0).each { |i| puts i }
4
3
2
1
0
=> 4
เนื่องจาก reverse_each ถูกอ้างว่าสร้างอาร์เรย์ทั้งหมดการหยุดทำงานจะมีประสิทธิภาพมากขึ้นอย่างชัดเจน ความจริงที่ว่านักออกแบบภาษาสามารถพิจารณานำสิ่งต่างๆเช่นนั้นไปใช้กับคำตอบของคำถามจริงตามที่ถามได้
เพื่อตอบคำถามตามที่ถามจริง ...
เหตุผลก็เพราะว่า Ruby เป็นภาษาที่น่าประหลาดใจไม่รู้จบ สิ่งที่น่าประหลาดใจบางอย่างเป็นเรื่องที่น่ายินดี แต่มีพฤติกรรมหลายอย่างที่เสียไปอย่างสิ้นเชิง แม้ว่าตัวอย่างต่อไปนี้บางส่วนจะได้รับการแก้ไขโดยรุ่นที่ใหม่กว่า แต่ก็ยังมีตัวอย่างอื่น ๆ อีกมากมายและยังคงเป็นคำฟ้องในแนวคิดของการออกแบบดั้งเดิม:
nil.to_s
.to_s
.inspect
ผลลัพธ์เป็น "" แต่
nil.to_s
# .to_s # Don't want this one for now
.inspect
ผลลัพธ์ใน
syntax error, unexpected '.', expecting end-of-input
.inspect
^
คุณอาจคาดหวัง << และผลักดันให้เหมือนกันสำหรับการต่อท้ายอาร์เรย์ แต่
a = []
a << *[:A, :B] # is illegal but
a.push *[:A, :B] # isn't.
คุณอาจคาดหวังว่า 'grep' จะทำงานเหมือนกับบรรทัดคำสั่ง Unix ที่เทียบเท่า แต่มันไม่ === จับคู่ไม่ = ~ แม้จะมีชื่อก็ตาม
$ echo foo | grep .
foo
$ ruby -le 'p ["foo"].grep(".")'
[]
วิธีการต่างๆเป็นนามแฝงซึ่งกันและกันโดยไม่คาดคิดดังนั้นคุณต้องเรียนรู้ชื่อหลายชื่อสำหรับสิ่งเดียวกันเช่นfind
และdetect
แม้ว่าคุณจะชอบนักพัฒนาซอฟต์แวร์ส่วนใหญ่และเคยใช้เพียงชื่อเดียว มากเหมือนกันไปสำหรับsize
, count
และlength
ยกเว้นสำหรับการเรียนที่กำหนดแต่ละที่แตกต่างกันหรือไม่ได้กำหนดหนึ่งหรือสองที่ทั้งหมด
เว้นแต่จะมีใครนำไปใช้อย่างอื่นเช่นวิธีการหลักtap
ได้รับการกำหนดใหม่ในไลบรารีอัตโนมัติต่างๆเพื่อกดบางอย่างบนหน้าจอ ขอให้โชคดีในการค้นหาว่าเกิดอะไรขึ้นโดยเฉพาะอย่างยิ่งหากโมดูลบางโมดูลที่จำเป็นสำหรับโมดูลอื่น ๆ บางโมดูลได้แยกโมดูลอื่นเพื่อทำสิ่งที่ไม่มีเอกสาร
วัตถุตัวแปรสภาพแวดล้อม ENV ไม่รองรับ 'ผสาน' ดังนั้นคุณต้องเขียน
ENV.to_h.merge('a': '1')
เป็นโบนัสคุณสามารถกำหนดค่าคงที่ของคุณหรือของคนอื่นใหม่ได้หากคุณเปลี่ยนใจเกี่ยวกับสิ่งที่ควรจะเป็น