iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
1
自我挑戰組

Ruby and Rails 的二三事系列 第 10

Ruby on Rails 的二三事 - Day10 其實我不懂Case...When

順手翻了一下之前發的文,發現之前在講流程控制的時候,忘記介紹Case...When了,
正好就拿來當今天的主題,廢話不多說,直接開始吧!

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的運作方式

上面的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)

另外,當我們用不同類別的物件去呼叫===時,===分別代表不同的意思:

  • Range(範圍)
  (1..10) === 1
  => true
  
  case 1
  when (1..10)
      do something
  end

這時候的===相當於 includes?

  • Regex()
  /hel/ === 'hello'
  
  case 'hello'
  when /hel/
  end

這時候的===相當於 match

  • Classes()
  Array === [1, 2, 3]
 [1, 2, 3].is_a?Array

這時候的===相當於 is_a?

  • Proc
-> 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


上一篇
Ruby on Rails 的二三事 - Day09 REST 和 RESTful
下一篇
Ruby on Rails 的二三事 - Day11 Gemfile
系列文
Ruby and Rails 的二三事19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言