คำสั่งควบคุมเงื่อนไข ในภาษา Ruby

คำสั่งควบคุมเงื่อนไข (Conditional statement) เป็นคำสั่งที่ใช้สำหรับควบคุมให้โปรแกรมทำงานตามเงื่อนไขที่กำหนด ในบทนี้ คุณจะได้เรียนรู้เกี่ยวกับการควบคุมการทำงานของโปรแกรมด้วยคำสั่งควบคุมชนิดต่างๆ คำสั่งควบคุมเงื่อนไขมักจะทำงานกับค่าของ Boolean เมื่อเราบอกว่าเงื่อนไขเป็นจริง นั่นหมายความว่าผลลัพธ์ของ Boolean นั้นมีค่าเป็น true และถ้าหากเงื่อนไขเป็นเท็จ ผลลัพธ์ของ Boolean นั้นจะมีค่าเป็น false

คำสั่ง if

คำสั่ง if เป็นคำสั่งควบคุมการที่ใช้กำหนดเพื่อให้โปรแกรมทำงานบางอย่างเมื่อเงื่อนไขเป็นจริง นี่เป็นรูปแบบการใช้งานของคำสั่ง if

if expression then
    statements
end

ถ้าหากเงื่อนที่กำหนดใน expression เป็นจริง โปรแกรมจะทำงานในบล็อคของคำสั่ง if ที่อยู่ระหว่างคำสั่ง then และ end โดยทั่วไปแล้ว เราจะสร้างเงื่อนไข expression จากตัวดำเนินการเปรียบเทียบ หรือตัวดำเนินการตรรกศาสตร์ นี่เป็นตัวอย่างแรกของเรา

a = 10
if a == 10 then
    puts "Value of a is 10"
end

ในตัวอย่าง เป็นการใช้งานคำสั่ง if เพื่อตรวจสอบว่าค่าของตัวแปร a นั้นเท่ากับ 10 หรือไม่ ถ้าหากเงื่อนไขเป็นจริง โปรแกรมจะทำงานในบล็อคของคำสั่ง if ซึ่งเป็นการแสดงข้อความ "Value of a is 10" ออกทางหน้าจอ แต่ถ้าหากเงื่อนไขไม่เป็นจริง โปรแกรมจะข้ามการทำงานของบล็อคคำสั่ง if ไป

Value of a is 10

นี่เป็นผลลัพธ์การทำงานของโปรแกรม โปรแกรมทำงานในบล็อคของคำสั่ง if เพราะเรากำหนดเงื่อนไขอย่างชัดเจนว่าตัวแปร a ต้องมีค่าเท่ากับ 10 ในตอนนี้ ถ้าหากคุณเปลี่ยนค่าของตัวแปรเป็นค่าอื่น โปรแกรมควรจะข้ามการทำงานไปเพราะเงื่อนไขไม่เป็นจริงนั่นเอง

อย่างไรก็ตาม การใส่คำสั่ง then หลังจากเงื่อนไขนั้นเป็นทางเลือก คุณสามารถใส่หรือไม่ใส่ก็ได้ สำหรับตัวอย่างในบทเรียนของเรา เราเลือกที่จะไม่ใช้เนื่องจากมันเขียนง่ายกว่า ดังนั้นจากโค้ดด้านบนเราสามารถเขียนได้เป็น

a = 10
if a == 10
    puts "Value of a is 10"
end

นอกจากนี้ ในบล็อคของคำสั่ง if คุณสามารถกำหนดให้โปรแกรมทำงานมากกว่าหนึ่งคำสั่งได้เมื่อเขียนไขเป็นจริง เพียงแค่เพิ่มคำสั่งเข้าไปตามที่คุณต้องการ

n = 7
if n.odd?
    puts "Value of n is #{n}"
    puts "n is odd number"
end

ในตัวอย่าง เป็นโปรแกรมตรวจสอบค่าในตัวแปร n ว่าเป็นเลขคี่หรือไม่ ถ้าหากเงื่อนไขเป็นจริง โปรแกรมจะทำงานในบล็อคของคำสั่ง if ซึ่งมีคำสั่งการแสดงผลสองคำสั่ง

Value of n is 7
n is odd number

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

คำสั่ง if-else

คำสั่ง if ใช้กำหนดเพื่อให้โปรแกรมทำงานเมื่อเงื่อนไขเป็นจริง ในทางกลับกัน คำสั่ง else นั้นใช้เพื่อกำหนดให้โปรแกรมทำงานเมื่อเงื่อนไขเป็นเท็จ และมันต้องใช้ร่วมกับคำสั่ง if เสมอ

if expression
    statement1
else
    statement2
end

ถ้าหากเงื่อนไขใน expression โปรแกรมจะทำงานในกลุ่มของคำสั่ง statement1 และถ้าหากเงื่อนไม่เป็นเท็จ โปรแกรมจะทำงานในกลุ่มของคำสั่ง statement2 แทน ดังนั้นนี่เป็นวิธีที่จะแยกการทำงานของให้ออกเป็นสองทางนั่นเอง

username = "Andy"
if username == "Mateo"
    puts "Login success"
    puts "Welcome #{username}"
else
    puts "Invalid username"
end

ในตัวอย่าง เป็นโปรแกรมตรวจสอบชื่อผู้ใช้สำหรับการเข้าสู่ระบบ โดยโปรแกรมจะตรวจสอบว่าค่าในตัวแปร username เท่ากับ "Mateo" หรือไม่ ถ้าหากเงื่อนเป็นจริงโปรแกรมจะทำงานในบล็อคของคำสั่ง if และถ้าหากไม่ใช่โปรแกรมจะทำงานในบล็อคของคำสั่ง else

Invalid username

และนี่เป็นผลลัพธ์การทำงานของโปรแกรม เนื่องจากว่าค่าในตัวแปร username นั้นเป็น "Andy" ซึ่งทำให้เงื่อนเป็นเท็จ ดังนั้นโปรแกรมทำงานในบล็อคของคำสั่ง else แทน

ตัวอย่างต่อมา เราจะแก้ไขโค้ดจากตัวอย่างด้านบนเล็กน้อย โดยทั่วไปแล้ว ในการเข้าสู่ระบบจะต้องใช้ทั้งชื่อผู้ใช้และรหัสผ่าน เราจะให้โปรแกรมสามารถถามข้อมูลทั้งสองอย่างผ่านทางคีย์บอร์ด เพื่อนำมาตรวจสอบในโปรแกรม

login.rb
print "Enter username: "
username = gets.chomp
print "Enter password: "
password = gets.chomp

if username == "Mateo" && password == "1234"
    puts "Login success"
    puts "Welcome #{username}"
else
    puts "Invalid username or password"
end

ในตัวอย่าง เป็นโปรแกรมตรวจสอบการเข้าสู่ระบบโดยการรับค่าชื่อผู้ใช้และรหัสผ่านมาจากคีบอร์ด และในการตรวจสอบเงื่อนไขนั้น username จะต้องมีค่าเท่ากับ "Mateo" และรหัสผ่านที่กรอกเข้ามาต้องเป็น "1234" เราใช้ตัวดำเนินการ And (&&) เพื่อเชื่อมเงื่อนไขทั้งสองเข้าด้วยกัน

Enter username: Mateo
Enter password: 1234
Login success
Welcome Mateo

นี่เป็นผลลัพธ์การทำงานของโปรแกรม เมื่อเรากรอกข้อมูลทั้งสองอย่างเพื่อทำให้เงื่อนไขเป็นจริง

Enter username: Mateo
Enter password: 1111
Invalid username or password

นี่เป็นผลลัพธ์การทำงานของโปรแกรม เมื่อเราลองกรอกรหัสผ่านผิด โปรแกรมจะทำงานในบล็อคของคำสั่ง else แทน

คำสั่ง if-elsif

คำสั่ง if-elsif เป็นคำสั่งที่ใช้สำหรับเงื่อนแบบหลายทางเลือก ในกรณีที่เราต้องการให้โปรแกรมเรานั้นมีเงื่อนไขที่เป็นไปได้มากกว่าสองเงื่อนไข และคำสั่ง elsif จะใช้ร่วมกับคำสั่ง if เพื่อกำหนดเงื่อนไขตั้งแต่เงื่อนไขที่สองเป็นต้นไป

if exp1
    statement1
elsif exp2
    statement2
elsif exp3
    statement3
else
    statement
end

โปรแกรมจะตรวจสอบเงื่อนไข exp1 ถ้าหากเงื่อนไขเป็นจริง โปรแกรมทำงานในบล็อคของคำสั่ง if และข้ามการตรวจสอบเงื่อนไขที่เหลือทั้งหมด หากเงื่อนไขจากคำสั่ง if ไม่เป็นจริง โปรแกรมจะตรวจสอบเงื่อนไขต่อไปคือ exp2 และถ้าหากเงื่อนไขเป็นจริง โปรแกรมจะทำงานในบล็อคของคำสั่ง elsif

และถ้าหากเงื่อนไขยังไม่เป็นจริง โปรแกรมจะตรวจสอบเงื่อนไขต่อไป exp3 และทำเช่นนี้จนกว่าจะพบเงื่อนไขที่เป็นจริงเพื่อที่จะทำงาน ซึ่งเราสามารถเชื่อมต่อคำสั่ง elsif เท่าไหร่ก็ได้ตามที่ต้องการ สุดท้าย คุณสามารถใช้คำสั่ง else เพื่อให้โปรแกรมทำงานในกรณีที่ไม่มีเงื่อนไขไหนที่เป็นจริงเลย

ต่อไปเป็นตัวอย่างการใช้งานคำสั่ง if-elsif ในการตรวจสอบว่าตัวเลขในตัวแปรนั้นเป็นจำนวนจริงบวก ลบ หรือศูนย์

sign.rb
n = -3
if n > 0
    puts "n is positive"
elsif n < 0
    puts "n is negative"
elsif n == 0
    puts "n is zero"
end

ในตัวอย่าง เป็นการใช้เพียงคำสั่ง if และ elsif เท่านั้นในการตรวจสอบ และเนื่องจากเราทราบว่ามีเพียงสามเงื่อนไขเท่านั้นที่เป็นไปได้ ดังนั้นเราสามารถใช้ร่วมกับคำสั่ง else ได้ ซึ่งสามารถเขียนใหม่ได้เป็น

n = -3
if n > 0
    puts "n is positive"
elsif n < 0
    puts "n is negative"
else
    puts "n is zero"
end

ซึ่งทั้งสองแบบนั้นให้ผลลัพธ์ที่เหมือนกันคือ

n is negative

ต่อไปมาดูตัวอย่างเพิ่มเติมสำหรับการใช้งานจากคำสั่งทั้งหมดที่คุณได้เรียนมา เราจะเขียนโปรแกรมสำหรับช่วยคำนวณเกรดโดยการรับคะแนนมาจากคีย์บอร์ด มันเป็นโปรแกรมที่แสดงการใช้งานคำสั่ง if elsif และ else ได้ดีเลยทีเดียว และนี่เป็นโค้ดของโปรแกรม

grade_calculator.rb
print "Enter your score: "
score = gets.chomp.to_i

grade = nil

if score >= 0 && score <= 100

    if score >= 80
        grade = "A"
    elsif score >= 70
        grade = "B"
    elsif score >= 60
        grade = "C"
    elsif score >= 50
        grade = "D"
    else
        grade ="F"
    end

    puts "Your score is #{score}"
    puts "Your grade is #{grade}"

else
    puts "Invalid score value, only 0 - 100 is allowed"
end

ในตัวอย่าง คุณจะเห็นว่าเราสามารถใช้คำสั่งควบคุมเงื่อนไขซ้อนกันได้ ในตอนแรกโปรแกรมของเรารับคะแนนจากทางคีย์บอร์ดมาเก็บไว้ในตัวแปร score

if score >= 0 && score <= 100
    ...
else
    puts "Invalid score value, only 0 - 100 is allowed"
end

และในการที่จะอนุญาติให้โปรแกรมทำงานได้ เราต้องการตรวจสอบว่าคะแนนนั้นต้องมีค่าอยู่ระหว่าง 0 - 100 เท่านั้น ไม่เช่นนั้นโปรแกรมจะแจ้งว่าใส่คะแนนไม่ถูกต้องและจบการทำงาน

if score >= 80
    grade = "A"
elsif score >= 70
    grade = "B"
elsif score >= 60
    grade = "C"
elsif score >= 50
    grade = "D"
else
    grade ="F"
end

puts "Your score is #{score}"
puts "Your grade is #{grade}"

และถ้าหากเงื่อนไขเป็นจริง คะแนนอยู่ในระหว่าง 0 - 100 โปรแกรมได้เข้ามาทำงานในบล็อคของคำสั่ง if นอกสุด และพบกับคำสั่ง if เพื่อตรวจสอบคะแนนว่าจะได้เกรดเท่าไหร่ และสุดท้ายเป็นการแสดงผลเกรดที่ได้จากคะแนนที่ให้มา

Enter your score: 75
Your score is 75
Your grade is B

และนี่เป็นผลลัพธ์การทำงานของโปรแกรมเมื่อเรากรอกคะแนนเป็น 75

คำสั่ง Ternary if

คำสั่ง Ternary if (?:) เป็นคำสั่งควบคุมเงื่อนไข if-else แบบสั้นที่มีสามโอเปอแรนด์ มันใช้สำหรับตรวจสอบเงื่อนไขและคำสั่งจะส่งค่ากลับตามเงื่อนไขที่เกิดขึ้น นี่เป็นรูปแบบการใช้งาน

expression ? value1: value2

ถ้าหากเงื่อนไข expression เป็นจริง โปรแกรมจะทำงานที่ value1 และส่งค่ากลับจากนิพจน์ดังกล่าว ไม่เช่นนั้นโปรแกรมจะทำงานและส่งค่ากลับจากนิพจน์ value2 แทน

percent = 50
message = percent < 100 ? "Downloading...": "Download completed"
puts message

ในตัวอย่าง เป็นการแสดงสถานนะของการดาวน์โหลดจากค่าเปอร์เซนต์ เนื่องจากค่าในตัวแปร percent น้อยกว่า 100 ดังนั้นการค่าที่ได้จากคำสั่งจึงเป็น "Downloading..."

ถ้าหากคุณสังเกต จะเห็นว่าเราสามารถเขียนโปรแกรมดังกล่าวโดยการใช้คำสั่ง if-else ได้เช่นกัน แต่สิ่งที่แตกต่างกันคือการใช้คำสั่ง Ternary if จะสั้นและกระทัดรัดกว่ามาก

percent = 50
message = nil
if percent < 100
    message = "Downloading..."
else
    message = "Download completed"
end
puts message

คำสั่ง unless

คำสั่ง unless นั้นกำหนดเงื่อนไขให้โปรแกรมทำงานในบล็อคของคำสั่งยกเว้นแต่ว่าเงื่อนไขจะเป็นจริง หรือกล่าวอีกนัยหนึ่งโปรแกรมจะทำงานเมื่อเงื่อนไขเป็นเท็จนั่นเอง ซึ่งมันเป็นคำสั่งที่ตรงข้ามกับคำสั่ง if ที่จะทำงานเมื่อเงื่อนไขเป็นจริง มาดูตัวอย่างการใช้งาน

x = 1
y = 3
unless x == y
    puts "x is not equal to y"
end

ในตัวอย่าง เราได้ประกาศสองตัวแปรคือ x และ y และกำหนดค่าที่ไม่เท่ากันให้กับตัวแปร ซึ่งในโปรแกรมนั้นมีหมายความว่าให้แสดงผล ยกเว้นแต่ว่า x มีค่าเท่ากับ y และเนื่องจาก x == y นั้นไม่เป็นจริง ดังนั้นโปรแกรมทำงานในบล็อคของคำสั่ง unless

x = 1
y = 3
unless x == y
    puts "x is not equal to y"
else
    puts "x equal to y"
end

นอกจากนี้ เราสามารถใช้งานคำสั่ง else ร่วมกับคำสั่ง unless ได้ ซึ่งโปรแกรมจะทำงานในบล็อคคำสั่ง else ถ้าหากเงื่อนไขเป็นจริง แต่โปรดจำไว้ว่าคุณไม่สามารถใช้งานคำสั่ง elsif ร่วมกับคำสั่ง unless ได้

# equal to unless
if not expression
    statements
end

อย่างที่เราได้บอกไปว่าคำสั่ง unless นั้นทำงานเมื่อเงื่อนไขเป็นเท็จ ซึ่งตรงกันข้ามกับคำสั่ง if นั่นหมายความว่าจริงๆ แล้วคุณสามารถใช้คำสั่ง if โดยการกลับเงื่อนไขด้วยตัวดำเนินการตรรกศาสตร์ Not แทนได้ อย่างไรก็ตาม คำสั่ง unless มีไว้เพื่ออำนวยความสะดวกจากสถานการณ์ดังกล่าว

Modifier if

Modifier if เป็นคำสั่งควบคุมการทำงานของบรรทัดคำสั่งของโปรแกรม โดยจะใส่ไว้ด้านหลังสุดของคำสั่ง การทำงานนั้นจะเหมือนกับคำสั่ง if ถ้าหากเงื่อนเป็นจริง โค้ดในบรรทัดที่วางคำสั่งนี้ไว้จะทำงาน นี่เป็นตัวอย่างการใช้งาน

name = "Mateo"
puts "Name is too long" if name.length >= 5
puts "Hello #{name}"

ในตัวอย่างเป็นโปรแกรมแสดงชื่อในตัวแปร name ออกทางหน้าจอ อย่างไรก็ตามก่อนการแสดงชื่อนั้นถ้าหากความยาวของชื่อมากกว่า 5 ตัวอักษร เราจะแสดงข้อความแจ้งว่าชื่อยาวเกินไปด้วย

Name is too long
Hello Mateo

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

Modifier unless

Modifier unless เป็นคำสั่งควบคุมการทำงานของบรรทัดคำสั่งของโปรแกรมเช่นเดียวกับคำสั่ง Modifier if แต่มันจะทำงานเมื่อเงื่อนไขไม่เป็นจริง มาดูตัวอย่างการใช้งาน

basket = ["Apple", "Orange", "Banana", "Peach"]
puts "There are #{basket.length} fruits left" unless basket.length >= 5
puts "List of Fruit"
basket.each_with_index { |item, index|
    puts "#{index + 1}. #{item}"
}

ในตัวอย่าง เป็นโปรแกรมแสดงผลไม้ที่มีทั้งหมดในตัวแปรอาเรย์ basket อย่างไรก็ตาม ก่อนแสดงผลนั้นถ้าหากว่าโปรแกรมมีผลลไม้น้อยกว่า 5 ผล จะมีการแจ้งเตือนว่ามีผลไม้เหลือเท่าไหร่ด้วย

เมธอด each_with_index ใช้สำหรับวนอ่านข้อมูลในอาเรย์โดยค่าที่จะถูกส่งมาในบล้อคคือชื่อผลไม้และ index ในอาเรย์

There are 4 fruits left
List of Fruit
1. Apple
2. Orange
3. Banana
4. Peach

นี่เป็นผลลัพธ์การทำงานของโปรแกรม

คำสั่ง case when

คำสั่ง case when เป็นคำสั่งควบคุมการทำงานของโปรแกรมเหมือนกับคำสั่งอื่นๆ แต่มันถูกออกแบบมาให้ใช้กับเงื่อนไขง่ายๆ และไม่ซับซ้อน เช่นการตรวจสอบความเท่ากับของข้อมูล ดังนั้นคำสั่ง case ให้เราสามารถกำหนดเงื่อนไขเพียงใช้ค่าคงที่ได้ นี่เป็นตัวอย่างการใช้งาน

a = 1

case a
when 1
    puts "one"
when 2
    puts "two"
else
    puts "unknown"
end

ในตัวอย่าง เป็นการใช้คำสั่ง case เพื่อตรวจสอบค่าในตัวแปรโดยการระบุตัวแปรเข้าไปในคำสั่ง ในกรณีนี้ เราได้ระบุเงื่อนไขเป็นค่าคงที่ 1 และ 2 สิ่งที่โปรแกรมทำคือจะทำการเปรียบเทียบค่าเหล่านี้ว่าเท่ากันหรือไม่ ถ้าหากเท่ากันโปรแกรมจะทำงานในบล็อคของคำสั่ง when และคุณสามารถใช้คำสั่ง else ได้ในกรณีที่การตรวจสอบค่าไม่ตรงกับเงื่อนไขใดๆ เลย

code = 1

case code 
when 200
    puts "success"
when 301, 302
    puts "redirect"
when 404
    puts "not found"
else
    puts "unknown status"
end

นอกจากนี้ ในการใช้คำสั่ง case คุณยังสามารถกำหนดหลายเงื่อนไขเพื่อเปรียบเทียบได้ โดยการใช้เครื่องหมายคอมมา (,) คั่นระหว่างแต่ละค่า ดังนั้นในคำสั่ง when 301, 302 นั้นหมายความว่าค่าในตัวแปร code ต้องเท่ากับ 301 หรือ 302

อย่างที่เราได้บอกไปว่า คำสั่ง case นั้นมักจะใช้กับเพื่อเปรียบเทียบเงื่อนไขง่ายๆ และไม่ซับซ้อน แต่อย่างไรก็ตาม คุณสามารถใช้งานคำสั่ง case เหมือนกับคำสั่ง if-elsif ได้

a = 3

case 
when a == 1 || a == 2
    puts "one, two"
when a == 3
    puts "three"
else
    puts "unknown"
end

ในกรณีนี้ คุณไม่จำเป็นต้องระบุค่าหลังจากคำสั่ง case แต่ในคำสั่งกำหนดเงื่อนไข when แค่ทำให้นิพจน์นั้นเป็นจริง เพื่อทำให้โปรแกรมทำงานในเงื่อนไขดังกล่าว

สำหรับการใช้งานกับ String นอกจากจะใช้เปรียบเทียบค่าแล้ว คุณยังสามารถกำหนดเงื่อนไขเป็น Regular Expression ได้ ถ้าหากคุณทำเช่นนั้น โปรแกรมจะทำการตรวจสอบด้วย Regular Expression แทน

a = "marcuscode"

case a
when /^mar/
    puts "start with mar"
when /^jar/
    puts "start with jar"
else
    puts "no pattern matched"
end

และนี่ก็เป็นตัวอย่างการใช้งานทั้งหมดสำหรับคำสั่ง case when และอย่างที่คุณเห็นเรามักจะใช้คำสั่ง case when กับเงื่อนไขที่ง่ายและไม่ซับซ้อน เพราะทำให้โค้ดของเราสามารถอ่านได้ง่ายขึ้นในบางกรณี

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับคำสั่งควบคุมเงื่อนไข ซึ่งมันสามารถช่วยให้โปรแกรมของเราสามารถตัดสินใจและทำงานภายใต้เงื่อนไขที่กำหนดได้