รับอาร์เรย์องค์ประกอบเดียวหรือศูนย์รับอาร์เรย์ - สองตัวหลังเป็นอาร์เรย์องค์ประกอบเดียวและอาร์เรย์ว่างตามลำดับ
ฉันคิดผิดว่า Ruby จะทำงานในลักษณะนี้:
[1,2,3].to_a #= [1,2,3] # Already an array, so no change
1.to_a #= [1] # Creates an array and adds element
nil.to_a #= [] # Creates empty array
แต่สิ่งที่คุณจะได้รับคือ:
[1,2,3].to_a #= [1,2,3] # Hooray
1.to_a #= NoMethodError # Do not want
nil.to_a #= [] # Hooray
ดังนั้นเพื่อแก้ปัญหานี้ฉันจำเป็นต้องใช้วิธีอื่นหรือฉันสามารถโปรแกรมเมตาได้โดยการแก้ไขวิธีการ to_a ของทุกคลาสที่ฉันตั้งใจจะใช้ซึ่งไม่ใช่ทางเลือกสำหรับฉัน
ดังนั้นวิธีการคือ:
result = nums.class == "Array".constantize ? nums : (nums.class == "NilClass".constantize ? [] : ([]<<nums))
ปัญหาคือมันเป็นเรื่องยุ่งเหยิง มีวิธีที่สวยงามในการทำเช่นนี้หรือไม่? (ฉันจะประหลาดใจถ้านี่เป็นวิธี Ruby-ish ในการแก้ปัญหานี้)
แอปพลิเคชันนี้มีอะไรบ้าง? ทำไมถึงแปลงเป็นอาร์เรย์
ใน ActiveRecord ของ Rails การโทรบอกว่าuser.posts
จะส่งกลับอาร์เรย์ของโพสต์โพสต์เดียวหรือศูนย์ เมื่อเขียนวิธีการที่ทำงานกับผลลัพธ์นี้เป็นเรื่องง่ายที่สุดที่จะสมมติว่าเมธอดนั้นใช้อาร์เรย์ซึ่งอาจมีองค์ประกอบเป็นศูนย์หนึ่งหรือหลายองค์ประกอบ ตัวอย่างวิธีการ:
current_user.posts.inject(true) {|result, element| result and (element.some_boolean_condition)}
==
แทนที่จะเป็น=
ใช่ไหม
[1,2,3].to_a
ไม่ได้กลับมา[[1,2,3]]
! มันกลับ[1,2,3]
มา
user.posts
ไม่ควรส่งคืนโพสต์เดียว อย่างน้อยฉันก็ไม่เคยเห็นมัน