iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 16
0
自我挑戰組

Ruby and Rails 的二三事系列 第 16

Ruby and Rails 的二三事 - Day16 && / and /| |/ or

  • 分享至 

  • xImage
  •  

從標題就開始鬼畫符是怎樣?

謀啦,這是今天要介紹的主角群啦!

這幾個邏輯運算子: && and || or

一開始都以為他們只是彼此的替身而已,殊不知,

待誌姆洗憨郎所想A架尼甘單!!


打開irb來做個簡單的驗證:

首先很簡單的定義兩個變數:

a = true
b = false

然後,一起來見證奇蹟的時刻:

c = a and b
=> false
c
=> true # 噠拉!!見證奇蹟的時刻!!!

d = a && b
=> false
d
=> false

有注意到嗎?and&& 看起來並不是完全相同的呢!


花生省魔術?

要了解上面的原因,得先知道下面這些概念:

  • =and 相比,= 有比較高的優先權,
  • =&& 相比,&& 有比較高的優先權,

姆...簡單的來說呢,上面的程式碼其實是這樣的:

((c = a) and b) 
=> false
c
=> true # 因為 = 有比較高的優先權,a 已經指派給 c 了,所以c 是 true 喔!
(d = (a && b))
=> false
d
=> false # 因為 && 有比較高的優先權,所以d 才會是 false 喔!

原來一切都是 Short-Circuit Evaluationy 做得好事,中文大概是翻作:
最短路徑評估。

When the first argument of the AND function evaluates to false,
the overall value must be false;
and when the first argument of the OR function evaluates to true,
the overall value must be true.


順著上面的解釋,來看看 or

true || fun()  # true
false || fun() # undefined method `fun' for main:Object

true or fun()  # true
false or fun() # undefined method `fun' for main:Object

姆... 所以呢?


小結:

  1. 盡量使用 && 和 || 避免不必要的誤會或狀況發生。
  2. 把 and 看成 if , or 看成 unless

第一點比較好理解,第二點的話看看下面的範例,會比較有感覺吧:

next if result = 2.even?

# 可以改寫成

result = 2.even? and next

cook_dinner() or raise(RuntimeError, "Not in the mood.")

# 可以改寫成

raise(RuntimeError, "Not in the mood.") unless cook_dinner()

大概就是這樣,腦袋鈍鈍的,就先這樣吧!
鐵人賽,我們明天見!!

參考資料:

Day22 and 和 or 比較
Understanding Boolean Operator Precedence in Ruby
Difference between && and and in Ruby
Ruby code整理系列 ||= 的使用


上一篇
Ruby and Rails 的二三事 - Day15 Model 之間的關聯
下一篇
Ruby and Rails 的二三事 - Day17 如何實作搜索表單
系列文
Ruby and Rails 的二三事19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言