ฉันจะเขียนswitch
คำสั่งใน Ruby ได้อย่างไร
ฉันจะเขียนswitch
คำสั่งใน Ruby ได้อย่างไร
คำตอบ:
Ruby ใช้case
นิพจน์แทน
case x
when 1..5
"It's between 1 and 5"
when 6
"It's 6"
when "foo", "bar"
"It's either foo or bar"
when String
"You passed a string"
else
"You gave me #{x} -- I have no idea what to do with that."
end
Ruby เปรียบเทียบวัตถุในส่วนwhen
คำสั่งกับวัตถุในส่วนcase
คำสั่งที่ใช้ตัว===
ดำเนินการ ยกตัวอย่างเช่นและไม่1..5 === x
x === 1..5
สิ่งนี้จะช่วยให้when
คำสั่งที่ซับซ้อนดังที่เห็นด้านบน ช่วงชั้นเรียนและทุกสิ่งสามารถทดสอบได้มากกว่าความเท่าเทียมกัน
ซึ่งแตกต่างจากswitch
งบในภาษาอื่น ๆ อีกมากมายทับทิมcase
ไม่มีฤดูใบไม้ร่วงผ่านจึงไม่มีความจำเป็นที่จะจบแต่ละกับwhen
break
นอกจากนี้คุณยังสามารถระบุตรงกันหลายอย่างในตัวเดียวประโยคเช่นwhen
when "foo", "bar"
when
และreturn
คำสั่งในบรรทัดเดียวกัน:when "foo" then "bar"
switch
งบในภาษาอื่น ๆ อีกมากมายทับทิมcase
ไม่ได้มีฤดูใบไม้ร่วงผ่านจึงไม่มีความจำเป็นที่จะจบแต่ละกับwhen
break
then
จำนวนมากดังนั้นคะแนนเสียงยังไม่ได้เอ่ยถึงคำหลัก โปรดดูคำตอบอื่น ๆ
case...when
มีพฤติกรรมเล็กน้อยโดยไม่คาดคิดเมื่อจัดการคลาส นี่คือสาเหตุที่ใช้ตัว===
ดำเนินการ
ตัวดำเนินการนั้นทำงานได้ตามที่คาดหวังโดยใช้ตัวอักษร แต่ไม่ใช่กับคลาส:
1 === 1 # => true
Fixnum === Fixnum # => false
ซึ่งหมายความว่าหากคุณต้องการทำcase ... when
คลาสของวัตถุสิ่งนี้จะไม่ทำงาน:
obj = 'hello'
case obj.class
when String
print('It is a string')
when Fixnum
print('It is a number')
else
print('It is not a string or number')
end
จะพิมพ์ "ไม่ใช่สตริงหรือตัวเลข"
โชคดีที่มันสามารถแก้ไขได้อย่างง่ายดาย ===
ผู้ประกอบการที่ได้รับการกำหนดไว้เพื่อให้มันกลับtrue
ถ้าคุณใช้มันกับการเรียนและจัดหาตัวอย่างของการเรียนที่เป็นตัวถูกดำเนินการที่สอง:
Fixnum === 1 # => true
ในระยะสั้นรหัสข้างต้นสามารถแก้ไขได้โดยการลบ.class
:
obj = 'hello'
case obj # was case obj.class
when String
print('It is a string')
when Fixnum
print('It is a number')
else
print('It is not a string or number')
end
ฉันเจอปัญหานี้วันนี้ในขณะที่มองหาคำตอบและนี่เป็นหน้าแรกที่ปรากฏดังนั้นฉันคิดว่ามันจะเป็นประโยชน์กับผู้อื่นในสถานการณ์เดียวกันของฉัน
.class
ส่วนร่วมเป็นสิ่งที่น่าสนใจที่จะต้องทราบขอบคุณ แน่นอนว่านี่เป็นพฤติกรรมที่เหมาะสมอย่างสมบูรณ์ (แม้ว่าฉันจะเห็นว่ามันอาจเป็นความผิดพลาดทั่วไปที่คิดว่าจะพิมพ์ออกมาIt is a string
) ... คุณกำลังทดสอบคลาสของวัตถุที่กำหนดเองบางอย่างไม่ใช่วัตถุเอง ดังนั้นสำหรับตัวอย่างเช่น: case 'hello'.class when String then "String!" when Class then "Class!" else "Something else" end
ผลลัพธ์ใน: "Class!"
นี้ทำงานเหมือนกันสำหรับ1.class
, {}.class
ฯลฯ หยด.class
ที่เราได้รับ"String!"
หรือ"Something else"
ค่าต่างๆเหล่านี้
มันทำโดยใช้case
ใน Ruby โปรดดูที่ " คำสั่งสลับ " ในวิกิพีเดีย
ที่ยกมา:
case n
when 0
puts 'You typed zero'
when 1, 9
puts 'n is a perfect square'
when 2
puts 'n is a prime number'
puts 'n is an even number'
when 3, 5, 7
puts 'n is a prime number'
when 4, 6, 8
puts 'n is an even number'
else
puts 'Only single-digit numbers are allowed'
end
ตัวอย่างอื่น:
score = 70
result = case score
when 0..40 then "Fail"
when 41..60 then "Pass"
when 61..70 then "Pass with Merit"
when 71..100 then "Pass with Distinction"
else "Invalid Score"
end
puts result
ในหน้า 123 ของภาษาการเขียนโปรแกรม Ruby (รุ่นที่ 1, O'Reilly) บน Kindle ของฉันกล่าวว่าthen
คำหลักที่ตามหลังwhen
คำสั่งสามารถถูกแทนที่ด้วยบรรทัดใหม่หรือเซมิโคลอน (เหมือนในif then else
ไวยากรณ์) (Ruby 1.8 ยังอนุญาตให้ใช้โคลอนแทนได้then
แต่ไม่อนุญาตให้ใช้ไวยากรณ์นี้ใน Ruby 1.9 อีกต่อไป)
when (-1.0/0.0)..-1 then "Epic fail"
type = #{score}
แต่ละบรรทัดฉันสามารถคัดลอกสิ่งที่คุณทำ มากสง่างามมากขึ้นฉันยังเหมือนหนึ่งสมุทรที่ดีมาก (ถ้าเป็นไปได้)
หากต้องการเพิ่มตัวอย่างเพิ่มเติมในคำตอบของ Chuck :
ด้วยพารามิเตอร์:
case a
when 1
puts "Single value"
when 2, 3
puts "One of comma-separated values"
when 4..6
puts "One of 4, 5, 6"
when 7...9
puts "One of 7, 8, but not 9"
else
puts "Any other thing"
end
ไม่มีพารามิเตอร์:
case
when b < 3
puts "Little than 3"
when b == 3
puts "Equal to 3"
when (1..10) === b
puts "Something in closed range of [1..10]"
end
โปรดระวัง " วิธีการเขียนคำสั่ง switch ใน Ruby " ที่ kikito เตือน
or
การเขียนโปรแกรมภาษาหลายคนโดยเฉพาะอย่างยิ่งที่ได้มาจาก C, มีการสนับสนุนที่เรียกว่าสวิทช์ Fallthrough ฉันกำลังค้นหาวิธีที่ดีที่สุดในการทำเช่นเดียวกันใน Ruby และคิดว่าอาจเป็นประโยชน์ต่อผู้อื่น:
ในภาษา C-like fallthrough มักมีลักษณะดังนี้:
switch (expression) {
case 'a':
case 'b':
case 'c':
// Do something for a, b or c
break;
case 'd':
case 'e':
// Do something else for d or e
break;
}
ใน Ruby สามารถทำได้ในวิธีต่อไปนี้:
case expression
when 'a', 'b', 'c'
# Do something for a, b or c
when 'd', 'e'
# Do something else for d or e
end
สิ่งนี้ไม่เทียบเท่าอย่างเคร่งครัดเพราะมันเป็นไปไม่ได้ที่จะให้เอ็กซี'a'
คิ้วท์โค้ดก่อนที่จะผ่านไป'b'
หรือ'c'
แต่สำหรับส่วนใหญ่ฉันพบว่ามันคล้ายกันมากพอที่จะเป็นประโยชน์ในทางเดียวกัน
ใน Ruby 2.0 คุณสามารถใช้ lambdas ในcase
ข้อความสั่งได้ดังนี้:
is_even = ->(x) { x % 2 == 0 }
case number
when 0 then puts 'zero'
when is_even then puts 'even'
else puts 'odd'
end
คุณยังสามารถสร้างเครื่องมือเปรียบเทียบของคุณเองได้อย่างง่ายดายโดยใช้โครงสร้างด้วยแบบกำหนดเอง ===
Moddable = Struct.new(:n) do
def ===(numeric)
numeric % n == 0
end
end
mod4 = Moddable.new(4)
mod3 = Moddable.new(3)
case number
when mod4 then puts 'multiple of 4'
when mod3 then puts 'multiple of 3'
end
(ตัวอย่างที่นำมาจาก " สามารถใช้ procs กับคำสั่ง case ใน Ruby 2.0 ได้หรือไม่ ")
หรือด้วยคลาสที่สมบูรณ์:
class Vehicle
def ===(another_vehicle)
self.number_of_wheels == another_vehicle.number_of_wheels
end
end
four_wheeler = Vehicle.new 4
two_wheeler = Vehicle.new 2
case vehicle
when two_wheeler
puts 'two wheeler'
when four_wheeler
puts 'four wheeler'
end
(ตัวอย่างที่นำมาจาก " คำชี้แจงกรณีทับทิมทำงานอย่างไรและคุณสามารถทำอะไรกับมันได้ ")
คุณสามารถใช้นิพจน์ทั่วไปเช่นการค้นหาประเภทของสตริง:
case foo
when /^(true|false)$/
puts "Given string is boolean"
when /^[0-9]+$/
puts "Given string is integer"
when /^[0-9\.]+$/
puts "Given string is float"
else
puts "Given string is probably string"
end
Ruby case
จะใช้ตัวถูกดำเนินการที่เท่าเทียมกัน===
สำหรับสิ่งนี้ (ขอบคุณ @JimDeville) ข้อมูลเพิ่มเติมสามารถดูได้ที่ " Ruby Operators " สิ่งนี้สามารถทำได้โดยใช้ตัวอย่าง @mmdemirbas (โดยไม่มีพารามิเตอร์) วิธีนี้จะสะอาดกว่าสำหรับเคสประเภทนี้
หากคุณอยากรู้วิธีใช้เงื่อนไข OR ในกรณีสวิตช์ Ruby:
ดังนั้นในcase
คำสั่ง a ,
จะเทียบเท่ากับ||
ในif
คำสั่ง
case car
when 'Maruti', 'Hyundai'
# Code here
end
ดูที่ " คำชี้แจงกรณีทับทิมทำงานอย่างไรและคุณสามารถทำอะไรกับมันได้ "
มันถูกเรียกcase
และใช้งานได้ตามที่คุณคาดหวังรวมไปถึงความสนุกที่เพิ่มเติมจาก===
การทดสอบ
case 5
when 5
puts 'yes'
else
puts 'else'
end
ตอนนี้เพื่อความสนุก:
case 5 # every selector below would fire (if first)
when 3..7 # OK, this is nice
when 3,4,5,6 # also nice
when Fixnum # or
when Integer # or
when Numeric # or
when Comparable # (?!) or
when Object # (duhh) or
when Kernel # (?!) or
when BasicObject # (enough already)
...
end
และมันกลับกลายเป็นว่าคุณสามารถแทนที่ข้อใดข้อหนึ่ง / เชน (นั่นคือแม้ว่าการทดสอบจะไม่เกี่ยวข้องกับตัวแปรทั่วไป) ด้วยการcase
ปล่อยcase
พารามิเตอร์เริ่มต้นและเพียงแค่เขียนนิพจน์ที่การแข่งขันครั้งแรกเป็นสิ่งที่คุณต้องการ
case
when x.nil?
...
when (x.match /'^fn'/)
...
when (x.include? 'substring')
...
when x.gsub('o', 'z') == 'fnzrq'
...
when Time.now.tuesday?
...
end
Ruby ใช้case
สำหรับการเขียนคำสั่ง switch
ตามcase
เอกสาร:
คำสั่ง Case ประกอบด้วยเงื่อนไขที่เป็นทางเลือกซึ่งอยู่ในตำแหน่งที่สามารถโต้แย้งได้
case
และเป็นศูนย์หรือwhen
อนุประโยคขึ้นไปwhen
ประโยคแรกเพื่อให้ตรงกับเงื่อนไข (หรือเพื่อประเมินความจริงบูลีนหากเงื่อนไขเป็นโมฆะ) "ชนะ" และรหัสของมันจะถูกดำเนินการ ค่าของข้อความสั่ง case คือค่าของwhen
clause ที่สำเร็จหรือnil
หากไม่มี clause ดังกล่าวคำสั่ง case สามารถลงท้ายด้วย
else
clause แต่ละwhen
คำสั่งสามารถมีค่าตัวเลือกหลายค่าคั่นด้วยเครื่องหมายจุลภาค
ตัวอย่าง:
case x
when 1,2,3
puts "1, 2, or 3"
when 10
puts "10"
else
puts "Some other number"
end
รุ่นที่สั้นกว่า:
case x
when 1,2,3 then puts "1, 2, or 3"
when 10 then puts "10"
else puts "Some other number"
end
และในฐานะที่เป็น " คำสั่งกรณีรูบี - เทคนิคขั้นสูง " อธิบายทับทิมcase
;
สามารถใช้กับช่วง :
case 5
when (1..10)
puts "case statements match inclusion in a range"
end
## => "case statements match inclusion in a range"
สามารถใช้กับRegex :
case "FOOBAR"
when /BAR$/
puts "they can match regular expressions!"
end
## => "they can match regular expressions!"
สามารถใช้กับProcs และ Lambdas :
case 40
when -> (n) { n.to_s == "40" }
puts "lambdas!"
end
## => "lambdas"
นอกจากนี้ยังสามารถใช้กับคลาสการแข่งขันของคุณเอง:
class Success
def self.===(item)
item.status >= 200 && item.status < 300
end
end
class Empty
def self.===(item)
item.response_size == 0
end
end
case http_response
when Empty
puts "response was empty"
when Success
puts "response was a success"
end
คุณอาจต้องการใช้แฮชของวิธีการทั้งนี้ขึ้นอยู่กับกรณีของคุณ
หากมีรายการที่มีความยาวwhen
และแต่ละรายการมีค่าที่เป็นรูปธรรมเพื่อเปรียบเทียบกับ (ไม่ใช่ช่วงเวลา) มันจะมีประสิทธิภาพมากกว่าในการประกาศแฮชของวิธีการแล้วเรียกวิธีที่เกี่ยวข้องจากแฮชแบบนั้น
# Define the hash
menu = {a: :menu1, b: :menu2, c: :menu2, d: :menu3}
# Define the methods
def menu1
puts 'menu 1'
end
def menu2
puts 'menu 2'
end
def menu3
puts 'menu3'
end
# Let's say we case by selected_menu = :a
selected_menu = :a
# Then just call the relevant method from the hash
send(menu[selected_menu])
เนื่องจากswitch case
ส่งคืนวัตถุเดียวเสมอเราสามารถพิมพ์ผลลัพธ์ได้โดยตรง:
puts case a
when 0
"It's zero"
when 1
"It's one"
end
ค่าหลายกรณีและเมื่อไม่มีค่า:
print "Enter your grade: "
grade = gets.chomp
case grade
when "A", "B"
puts 'You pretty smart!'
when "C", "D"
puts 'You pretty dumb!!'
else
puts "You can't even use a computer!"
end
และวิธีแก้ปัญหาการแสดงออกปกติที่นี่:
print "Enter a string: "
some_string = gets.chomp
case
when some_string.match(/\d/)
puts 'String has numbers'
when some_string.match(/[a-zA-Z]/)
puts 'String has letters'
else
puts 'String has no numbers or letters'
end
case some_string, when /\d/, (stuff), when /[a-zA-Z]/, (stuff), end
(ขึ้น,
บรรทัดใหม่)
คุณสามารถเขียนcase
นิพจน์ได้สองวิธีใน Ruby:
if
คำสั่งcase
และแต่ละwhen
ข้อจะถูกเปรียบเทียบกับเป้าหมายage = 20
case
when age >= 21
puts "display something"
when 1 == 0
puts "omg"
else
puts "default condition"
end
หรือ:
case params[:unknown]
when /Something/ then 'Nothing'
when /Something else/ then 'I dont know'
end
คุณสามารถทำสิ่งนี้ได้อย่างเป็นธรรมชาติมากขึ้น
case expression
when condtion1
function
when condition2
function
else
function
end
มีคำตอบที่ดีมากมาย แต่ฉันคิดว่าฉันจะเพิ่ม factoid หนึ่งอัน .. หากคุณพยายามเปรียบเทียบวัตถุ (คลาส) ให้แน่ใจว่าคุณมีวิธีการจัดส่งในอวกาศ (ไม่ใช่เรื่องตลก) หรือเข้าใจวิธีการเปรียบเทียบ
" Ruby Equality and Object Comparison " เป็นการสนทนาที่ดีในหัวข้อ
<=>
ซึ่งจะใช้ในการส่งกลับ -1, 0, 1 หรือศูนย์ขึ้นอยู่กับว่าการเปรียบเทียบส่งกลับน้อยกว่าเท่ากับเท่ากับมากกว่าหรือไม่เทียบเท่าตามลำดับ เอกสารโมดูลเปรียบเทียบของ Ruby ได้อธิบายไว้แล้ว
ตามที่ระบุไว้ในหลายคำตอบข้างต้น===
ผู้ประกอบการจะใช้ภายใต้ประทุนบนcase
/ when
งบ
นี่คือข้อมูลเพิ่มเติมเกี่ยวกับโอเปอเรเตอร์นั้น:
===
คลาสในตัวรูบี้จำนวนมากเช่น String, Range, และ Regexp นำเสนอการใช้งานของ===
โอเปอเรเตอร์ของตัวเองหรือที่เรียกว่า "case-equality", "triple equals" หรือ "threequals" เนื่องจากมันมีการใช้งานที่แตกต่างกันในแต่ละชั้นเรียนมันจะทำงานแตกต่างกันไปขึ้นอยู่กับประเภทของวัตถุที่ถูกเรียกใช้ โดยทั่วไปแล้วจะส่งกลับค่าจริงหากวัตถุทางด้านขวา "เป็นของ" หรือ "เป็นสมาชิกของ" วัตถุทางด้านซ้าย ตัวอย่างเช่นมันสามารถใช้ในการทดสอบว่าวัตถุเป็นตัวอย่างของการเรียน (หรือหนึ่งในชั้นย่อยของมัน)
String === "zen" # Output: => true
Range === (1..2) # Output: => true
Array === [1,2,3] # Output: => true
Integer === 2 # Output: => true
ผลเดียวกันสามารถทำได้ด้วยวิธีการอื่น ๆ ซึ่งอาจมีความเหมาะสมดีที่สุดสำหรับงานเช่นและis_a?
instance_of?
===
เมื่อ===
โอเปอเรเตอร์ถูกเรียกบนอ็อบเจกต์ช่วงมันจะคืนค่าจริงหากค่าด้านขวาอยู่ภายในช่วงทางด้านซ้าย
(1..4) === 3 # Output: => true
(1..4) === 2.345 # Output: => true
(1..4) === 6 # Output: => false
("a".."d") === "c" # Output: => true
("a".."d") === "e" # Output: => false
โปรดจำไว้ว่า===
โอเปอเรเตอร์จะเรียกใช้===
เมธอดของวัตถุด้านซ้าย ดังนั้นจะเทียบเท่ากับ(1..4) === 3
(1..4).=== 3
กล่าวอีกนัยหนึ่งคลาสของตัวถูกดำเนินการทางด้านซ้ายจะกำหนด===
ว่าจะเรียกใช้งานวิธีการใดดังนั้นตำแหน่งของตัวถูกดำเนินการจึงไม่สามารถใช้แทนกันได้
===
ผลตอบแทนจริงถ้าสตริงด้านขวาตรงกับการแสดงออกปกติทางด้านซ้าย
/zen/ === "practice zazen today" # Output: => true
# is similar to
"practice zazen today"=~ /zen/
ความแตกต่างที่เกี่ยวข้องเพียงอย่างเดียวระหว่างสองตัวอย่างข้างต้นคือเมื่อมีการจับคู่===
คืนค่าจริงและ=~
ส่งกลับจำนวนเต็มซึ่งเป็นค่าจริงในทับทิม เราจะกลับมาที่นี่ในไม่ช้า
puts "Recommend me a language to learn?"
input = gets.chomp.downcase.to_s
case input
when 'ruby'
puts "Learn Ruby"
when 'python'
puts "Learn Python"
when 'java'
puts "Learn Java"
when 'php'
puts "Learn PHP"
else
"Go to Sleep!"
end
$age = 5
case $age
when 0 .. 2
puts "baby"
when 3 .. 6
puts "little child"
when 7 .. 12
puts "child"
when 13 .. 18
puts "youth"
else
puts "adult"
end
ดู " Ruby - if ... else, case, เว้นแต่ " สำหรับข้อมูลเพิ่มเติม
ฉันเริ่มใช้:
a = "secondcase"
var_name = case a
when "firstcase" then "foo"
when "secondcase" then "bar"
end
puts var_name
>> "bar"
จะช่วยให้รหัสกะทัดรัดในบางกรณี
Hash
มากกว่าcase
คำสั่ง
ไม่รองรับการแสดงออกปกติในสภาพแวดล้อมของคุณ? เช่นShopify Script Editor (เมษายน, 2018):
[ข้อผิดพลาด]: RegExpคงที่แบบไม่กำหนดค่าเริ่มต้น
วิธีแก้ปัญหาต่อไปนี้เป็นการรวมกันของวิธีการที่กล่าวถึงก่อนหน้านี้แล้วในที่นี้และที่นี่ :
code = '!ADD-SUPER-BONUS!'
class StrContains
def self.===(item)
item.include? 'SUPER' or item.include? 'MEGA' or\
item.include? 'MINI' or item.include? 'UBER'
end
end
case code.upcase
when '12345PROMO', 'CODE-007', StrContains
puts "Code #{code} is a discount code!"
when '!ADD-BONUS!'
puts 'This is a bonus code!'
else
puts 'Sorry, we can\'t do anything with the code you added...'
end
ผมใช้or
ในคำสั่งวิธีการเรียนตั้งแต่มีลำดับความสำคัญสูงกว่า||
.include?
หากคุณเป็นทับทิม - นาซีโปรดจินตนาการว่าฉันใช้สิ่งนี้(item.include? 'A') || ...
แทน ทดสอบrepl.it
การเน้นเครื่องหมายจุลภาค ( ,
) ในwhen
ประโยคเป็นสิ่งสำคัญ จะทำหน้าที่เป็น||
ของif
คำสั่งที่เป็นมันไม่หรือเปรียบเทียบและไม่และเปรียบเทียบระหว่างการแสดงออกที่คั่นของwhen
ประโยค ดูคำสั่งกรณีต่อไปนี้:
x = 3
case x
when 3, x < 2 then 'apple'
when 3, x > 2 then 'orange'
end
=> "apple"
x
มีจำนวนไม่น้อยกว่า 2 "apple"
แต่ค่าตอบแทนเป็น ทำไม? เนื่องจากx
เป็น 3 และตั้งแต่',`` acts as an
| | , it did not bother to evaluate the expression
x <2 '
คุณอาจคิดว่าการใช้ANDคุณสามารถทำสิ่งนี้ได้ แต่ไม่ได้ผล:
case x
when (3 && x < 2) then 'apple'
when (3 && x > 2) then 'orange'
end
=> nil
มันใช้งานไม่ได้เพราะ(3 && x > 2)
ประเมินเป็นจริงและ Ruby นำค่า True มาเปรียบเทียบx
กับ===
ซึ่งไม่เป็นความจริงเนื่องจากx
เป็น 3
หากต้องการทำการ&&
เปรียบเทียบคุณจะต้องปฏิบัติcase
เหมือนif
/ else
บล็อก:
case
when x == 3 && x < 2 then 'apple'
when x == 3 && x > 2 then 'orange'
end
ในการเขียนโปรแกรมทับทิมหนังสือภาษา, แมทซ์กล่าวว่ารูปแบบหลังนี้เป็นเรื่องง่าย (และไม่บ่อยใช้) รูปแบบซึ่งเป็นอะไรมากไปกว่าไวยากรณ์ทางเลือกสำหรับif
/ /elsif
else
อย่างไรก็ตามไม่ว่าจะมีการใช้งานไม่บ่อยนักหรือไม่ก็ตามฉันไม่เห็นวิธีอื่นในการแนบหลาย&&
นิพจน์สำหรับwhen
ประโยคที่กำหนด
if...elsif
? ดูเหมือนว่าคุณกำลังพยายามที่จะผสมคำสั่งกรณีและเงื่อนไข ทำไม? เพียงแค่ใส่เงื่อนไขภายในบล็อกเมื่อเช่น when 3; ( x < 2 ) ? 'apple' : 'orange'
เราสามารถเขียนคำสั่ง switch สำหรับหลายเงื่อนไขได้
ตัวอย่างเช่น,
x = 22
CASE x
WHEN 0..14 THEN puts "#{x} is less than 15"
WHEN 15 THEN puts "#{x} equals 15"
WHEN 15 THEN puts "#{x} equals 15"
WHEN 15..20 THEN puts "#{x} is greater than 15"
ELSE puts "Not in the range, value #{x} "
END
case
, when
, end
) เป็นกรณี ๆ ไปและไม่สามารถเป็นตัวพิมพ์ใหญ่เช่นนี้
NoMethodError (undefined method
CASE 'สำหรับ main: Object) ` ดังที่ @ sondra.kinsey พูดว่าคุณไม่สามารถใช้ตัวพิมพ์ใหญ่ได้ ทับทิมจะคิดว่ามันคงที่
ตัวcase
ดำเนินการคำสั่งนั้นเหมือนswitch
ในภาษาอื่น ๆ
นี่คือไวยากรณ์ของswitch...case
ใน C:
switch (expression)
{
case constant1:
// statements
break;
case constant2:
// statements
break;
.
.
.
default:
// default statements
}
นี่คือไวยากรณ์ของcase...when
ใน Ruby:
case expression
when constant1, constant2 #Each when statement can have multiple candidate values, separated by commas.
# statements
next # is like continue in other languages
when constant3
# statements
exit # exit is like break in other languages
.
.
.
else
# statements
end
ตัวอย่างเช่น:
x = 10
case x
when 1,2,3
puts "1, 2, or 3"
exit
when 10
puts "10" # it will stop here and execute that line
exit # then it'll exit
else
puts "Some other number"
end
สำหรับข้อมูลเพิ่มเติมโปรดดูcase
เอกสารประกอบ