先来看一下结论,因为 eql? 及 equal? 的用法与 == 类似,这边也顺便介绍一下他们的用法。
p 666 == 666.0 # true,左边的型态是 Fixnum,右边的型态是 Float,但值都是 666,== 只要值一样就会判定是 true
p 666.eql?(666.0) # false,左边的型态是 Fixnum,右边的型态是 Float,虽然值都是 666,但 eql? 如果型态不同就会判定是 false
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 且值是否一样。
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),比较完之後要给出的答案有三种写法
x = 3
p case x
when 1
"one"
when 2 ; "two"
when 3 then "three"
else "many"
end
# 印出 three
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 领域的发展 (下)
这个得上一篇:https://ithelp.ithome.com.tw/articles/10261...
庆祝国庆日啦 成功的 失败的 import "./styles.css"; im...
Azure machine learning: workspace and compute grou...
Attribute vs Property attribute:属性在 HTML 会被称为 attr...
这篇我们来建立Release pipeline吧! 从Azure DevOps Project左边的...