ในหัวข้อนี้จะลงไปที่ 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 นั้นอยู่ในช่วงดังกล่าวหรือไม่
การทำงานของ 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 ให้มากขึ้น