iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
Modern Web

網頁前後端寶石庫-礦坑補完計畫系列 第 27

Day 27 Ruby == vs ===

阿修說文解字

先來看一下結論,因為 eql? 及 equal? 的用法與 == 類似,這邊也順便介紹一下他們的用法。

  • eql? 用於判斷兩個物件是否有相同的值以及型態
  • equal? 用於測試兩個值是否指向相同物件(指向同個 reference),也就是記憶體位置是否相同。
  • == 用於測試相等性,判斷兩個物件是否有相同的值
  • === 稱為「情況相等性」運算符,不同型別的 === 比較方式會不一樣,常用於在 case when 上面,測試case 述句的目標值是否與 when 的子述句相同

== & eql?

範例:

p 666 == 666.0      # true,左邊的型態是 Fixnum,右邊的型態是 Float,但值都是 666,== 只要值一樣就會判定是 true
p 666.eql?(666.0)   # false,左邊的型態是 Fixnum,右邊的型態是 Float,雖然值都是 666,但 eql? 如果型態不同就會判定是 false

equal?

範例:

a = "五倍券"
b = c = "五倍券"
p a.equal?(b)       # false,雖然 a 跟 b 都是指向五倍券的字串,但他們並不是指向相同的記憶體位置,字串的記憶體位置會隨著你每次的宣告而變動,符號則不會,這邊如果把字串改成符號,那答案就會是 true。
p b.equal?(c)       # true,b、c 都是指向同個記憶體位置的五倍券
p a.object_id       # 60,用 object_id 來確認記憶體位置,a 為 60
p b.object_id       # 80,用 object_id 來確認記憶體位置,b、c 為 80
p c.object_id       # 80

===

不同型別的 === 比較方式會不一樣。
像是 Range 會測試右邊的值是否落在左邊的範圍內。
Regexp(正規表達式) 會測試右邊的字串是否相符於左邊的正規表達式。
Class 會測試右邊的值的型態是否跟左邊的型態一樣。
Symbol 會測試右邊的型態是否為 Symbol 且值是否一樣。

範例1:

p (1..10) === 8     # true,8 被包含在 1~10 以內
p /\d/ === "123abc" # true,字串相符於正規表達式,\d 表示字串內是否含有數字
p Fixnum === 123    # true,123 的型態是 Fixnum
p :a === :a         # true,右邊的型態是符號,且值都是 a
p :a === "a"        # false,雖然左右兩邊的值都是 a,但型態不同

=== 常用在 case when 內,一般我們都會用範例2的寫法來使用 case when,Ruby 會自動轉成範例3的方式來幫我們比較。

另外補充一下 case when 的用法(如範例2),比較完之後要給出的答案有三種寫法

  1. 直接換行
  2. 用 ; 代替換行
  3. 用 then 代替換行

範例2:

x = 3
p case x
  when 1 
    "one"
  when 2 ; "two"
  when 3 then "three"
  else "many"
  end
# 印出 three

範例3:

x = 3
p case x
  when 1 === x then "one"
  when 2 === x then "two"
  when 3 === x then "three"
  else "many"
  end

參考:
[1]The Ruby Programming Language (O'REILLY)


上一篇
Day 26 Ruby Symbol
下一篇
Day 28 Rails shallow nesting
系列文
網頁前後端寶石庫-礦坑補完計畫30

2 則留言

1
juck30808
iT邦新手 2 級 ‧ 2021-10-12 18:30:58

第27天了! 恭喜即將完賽 (拍手!!!

阿修 iT邦新手 5 級 ‧ 2021-10-12 18:36:52 檢舉

謝謝! 也恭喜你快完賽了

1
王天君
iT邦新手 4 級 ‧ 2021-10-14 22:30:16

我快面有出這題…可惜我好像答錯了= ="
修哥快完賽了!衝啊!!/images/emoticon/emoticon14.gif

阿修 iT邦新手 5 級 ‧ 2021-10-15 08:25:21 檢舉

我那時候===也是答錯了
只好後續再來惡補

我要留言

立即登入留言