Control structures

ในหัวข้อนี้จะลงไปที่ control structures Case ปกติการใช้ case นั้นจะใช้ในกรณีที่มีการเรียงลำดับของเงื่อนไข case ใน ruby เทียบได้กับ switch ในภาษา C และ Java แต่มีข้อดีและแตกต่างกว่า

ruby> i=8
            ruby> case i
            | when 1, 2..5
            |   print "1..5\n"
            | when 6..10
            |   print "6..10\n"
            | end
            6..10
               nil
2..5 หมายถึง ช่วงที่อยู่ระหว่าง 2 ถึง 5 โดยจะทำการตรวจสอบว่าค่าของ i นั้นอยู่ในช่วงดังกล่าวหรือไม่
(2..5) === i
การทำงานของ case นั้นใช้ === เพื่อตรวจสอบหลายเงื่อนไขในคราวเดียว โดยที่ === จะทำงานได้ดีสำหรับวัตถุที่มีการใช้เงื่อนไข when ตัวอย่างต่อไปนี้มีการตรวจสอบ string ให้ตรงทุกตัวใน when แรกและมีการใช้ regular expression ใน when ที่สอง
ruby> case 'abcdef'
            | when 'aaa', 'bbb'
            |   print "aaa or bbb\n"
            | when /def/
            |   print "includes /def/\n"
            | end
            includes /def/
               nil

While Ruby มีสิ่งอำนวยความสะดวกในการวน loop เพราะในคราวต่อไปในเรื่งของ iteration จะทำให้เราเขียน loop ได้น้อยลง While เป็นการทำซ้ำของ if เราเคยใช้กันแล้วในการเขียนเกม word-guessing puzzle และในการเขียน regular expression โดยมีโครงสร้าง while เงื่อนไข . . . end โดยที่มันจะทำซ้ำต่อเมื่อ condition ออกมาเป็นจริง(true)เท่าั้น แต่ทว่า while และ if สามารถเขียนร่วมกันได้อย่างง่ายดาน
ruby> i = 0
               0
            ruby> print "It's zero.\n" if i==0
            It's zero.
               nil
            ruby> print "It's negative.\n" if i<0
               nil
            ruby> print "#{i+=1}\n" while i<3
            1
            2
            3
               nil
บางครั้งอาจจะต้องการผลลัพธ์ของเงื่อนไขเป็นแบบตรงข้าม unless เป็นผลตรงข้ามของ if หมายถึงถ้าใน if เป็นจริง ใน unless จะเป็นเท็จ มี 4 วิธีที่จะทำการขัดจังหวะของ loop จากภายใน 1. breakเหมือนในภาษา c ออกจาก loop 2. next เป็นการข้ามไปเริ่มต้น loop ในรอบใหม่ (continue ในภาษา c) 3. redo เป็นการทำซ้ำในรอบของ loop นั้น 4. return เป็นการออกจาก loop และยังออกจาก method ที่มี loop นั้นอีกด้วย และถ้ามี argument มันจะทำการคืนค่าออกมาให้เมื่อมีการเรียกใช้หรือถ้าไม่มีก็จะคืนค่า nil for คนที่เคยเขียนภาษา c มาก่อนจะมีความกังวลใจอย่างมากว่า for loop นั้นจะเขียนอย่างไร for loop ใน ruby นั้นมีความพิเศษมากกว่าที่คาดไว้อย่างแน่นอน loop ต่อไปนี้จะเป็นการทำงานสำหรับแต่ละ element ใน collection
for elt in collection
            ...
            end
collection สามารถเป็นช่วงของค่าใดๆก็ได้
ruby> for num in (4..6)
            |    print num,"\n"
            | end
            4
            5
            6
               4..6
บางทีอาจจะเป็น collection แบบอื่นก็เป็นได้ อย่างเช่น array
ruby> for elt in [100,-9.6,"pickle"]
            |    print "#{elt}\t(#{elt.type})\n"
            | end
            100    (Fixnum)
            -9.6   (Float)
            pickle (String)
               [100, -9.6, "pickle"]
แต่ว่าเรายังสามารถเขียน for อีกแบบหนึ่งได้เป็น each ซึ่งก็เกิดขึ้นได้บ่อยๆ ซึ่ง code ต่อไปนี้มีความหมายเท่ากัน
#  If you're used to C or Java, you might prefer this.
            for i in collection
            ...
            end
            
            #  A Smalltalk programmer might prefer this.
            collection.each {|i|
            ...
            }
Iterators สามารถถูกแทนที่ได้โดยการใช้ loop แต่ถ้าได้ลองได้ใช้ iterator ดูแล้วลองทำความคุ้นเคยก็บมันดูจะรู้ว่ามันง่ายมาก ดังนั้นจึงแนะนำให้ลองศึกษา iterator ให้มากขึ้น

Tue, 25 Jul 2006 16:13 Posted in

Tags , , ,

Comment Control structures


RSS