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 27. slate × Normalizing × normalize

>>:  day27_ARM 在 Server 领域的发展 (下)

第57天~

这个得上一篇:https://ithelp.ithome.com.tw/articles/10261...

Day 25 - 用 canvas 做 烟火

庆祝国庆日啦 成功的 失败的 import "./styles.css"; im...

Day 19 Azure machine learning: workspace and compute group- 从零开始

Azure machine learning: workspace and compute grou...

Day 04 HTML/JavaScript Attribute vs Property

Attribute vs Property attribute:属性在 HTML 会被称为 attr...

【把玩Azure DevOps】Day23 CI/CD从这里:建立第一个Releases Pipeline

这篇我们来建立Release pipeline吧! 从Azure DevOps Project左边的...