def tlist(root,prefix='',symbol='',suffix='',deep=0) puts prefix + symbol + suffix + (deep == 0 ? root : File.basename(root)) if File.directory?(root) entries = Dir.entries(root).sort entries.each_with_index do |ent, i| nsymbol = i == entries.size - 1 ? '`' : '|' nprefix = (symbol == '`' ? " " : "! ") * deep unless ent =~ /^\.|\.\.$/ tlist(File.expand_path(ent, root), nprefix, nsymbol, '--', deep+1) end end end end
พยายามใช้ตัวแปรชื่อเดียวกับคุณสุกรี
จะได้นำไปเปรียบเทียบกับ python ได้ง่าย
ส่วนที่ต่างกัน และน่าหงุดหงิดนิดหน่อยสำหรับผมก็คือ
ลำดับของ argument ใน File.expand_path(ent, root)
ซึ่งเทียบเท่ากับ os.path.join(root,ent) ใน python
คือลำดับของ python ดูเป็นธรรมชาติกว่า
ซึ่ง่ประเด็นของลำดับแบบนี้อาจจะเป็นเพราะ คนญี่ปุ่นเป็นคนเขียน
เลยทำให้ลำดับสลับในลักษณะขวามาซ้ายก็ได้
ส่วนที่ต่างกันอีกจุด ก็คือ ใน python
array ที่ return จาก os.listdir(root)
จะไม่มี "." กับ ".."
แต่ของ ruby Dir.entries(root) จะรวม "." กับ ".." มาด้วย
ส่วน code ข้างล่างนี้ ลองทำ variation ไปอีกแบบ
def tlist2(root,prefix='',symbol='',suffix='',deep=0) puts prefix + symbol + suffix + (deep == 0 ? root : File.basename(root)) if File.directory?(root) entries = Dir.entries(root).delete_if {|x| x=~ /^\.(\.)?$/}.sort symbols = ['|'] * (entries.size - 1) << '`' nprefix = (symbol == '`' ? " " : "! ") * deep entries.zip(symbols.to_a) do |ents| tlist2(File.expand_path(ents[0], root), nprefix, ents[1], '--', deep+1) end end end
Note: ตัวแปร argument suffix สามารถเอาออกได้
แต่ขี้เกียจแล้ว
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
ขุดโจทย์ล้านปีเอามาเล่นว่างๆ หลังเกม Champions League
ตรง directory ขอเป็นสัญลักษณ์'+' ละกัน รู้สึกจะชัดเจนกว่า
เขียนไปเขียนมาเกือบไม่ขำ... ได้ออกมาหน้าตาแบบนี้
ป.ล. หวังว่าสักวันจะเขียนสั้นๆได้แบบข้างบนบ้าง :P
ป.ล.2 ขอบคุณ p'pok ครับ แก้ใหม่แล้ว (ทำไมไม่เขียนแบบนี้ตั้งแต่แรก งงตัวเอง)
ตรงนี้อ่านยาก
อันนี้น่าจะยุบรวมกันได้ (โปรแกรมเมอร์หัวเก่า มันจะไปนึกถึงเรื่องการวบลูปเกินจำเป็น)
ถึงขั้นมึนจนอ่านไล่ไม่ทัน