順手翻了一下之前發的文,發現之前在講流程控制的時候,忘記介紹Case...When了,
正好就拿來當今天的主題,廢話不多說,直接開始吧!
前面我們介紹過if...elsif
的語法,通常這代表你需要判斷的條件比較複雜,
比如說像下面的例子:
def blood_type(type)
if type == 'A'
puts "你的血型是A型"
elsif type == 'B'
puts "你的血型是B型"
elsif type == 'O'
puts "你的血型是O型"
elsif type == 'AB'
puts "你的血型是AB型"
else
puts "血型未確認"
end
end
blood_type('A') # 你的血型是A型
通常這時候,你可以改用case...when
的方式來改寫:
def blood_type(type)
case type
when 'A'
puts "你的血型是A型"
when 'B'
puts "你的血型是B型"
when 'O'
puts "你的血型是O型"
when 'AB'
puts "你的血型是AB型"
else
puts "血型未確認"
end
end
blood_type('A') # 你的血型是A型
嗯,case...when就介紹到這邊? 當然不是這樣的!
上面的case...when
在運作的時候,其實是這樣的:
'A' === type
'B' === type
'O' === type
'AB' === type
看出不同了嗎?case...when
用的是===
, if...else
用的是==
,而且我們的條件跑到===
的左邊去了,
這代表呼叫方法的對象是不同的喔!;
Ruby裡,每樣東西都是物件。
上面這句話,已經重複N遍了,讓我們來還原一部分上面的code來看看吧!
if...else
type == 'B'
type.==('B')
case ... when
'B' === type
'B'.===(type)
另外,當我們用不同類別的物件去呼叫===
時,===
分別代表不同的意思:
(1..10) === 1
=> true
case 1
when (1..10)
do something
end
這時候的===
相當於 includes?
/hel/ === 'hello'
case 'hello'
when /hel/
end
這時候的===
相當於 match
Array === [1, 2, 3]
[1, 2, 3].is_a?Array
這時候的===
相當於 is_a?
-> a { a > 5 } === 6
這時候的===
相當於 call
姆,感覺還是沒有好好的把case...when解釋好...
只好附上參考資料,讓各位自己去研讀了 :P
鐵人賽,我們明天見!
參考資料:
The Many Uses Of Ruby Case Statements
Ruby的case語法
How A Ruby Case Statement Works
Triple Equals Black Magic