在接觸正式專案後,常常會對一些 code 不甚理解,
尤其是在邏輯判斷
,感到苦手,所以想紀錄一下究竟if
、unless
該怎麼去理解
底下定義了兩個簡單的方法,分別使用了if
、unless
來判斷,我們看看得到了什麼不同的結果?
irb(main):001:0> def if_method(arg1)
irb(main):002:1> return if arg1.empty?
irb(main):003:1> puts "no, I'm not empty"
irb(main):004:1> end
=> :if_method
irb(main):005:0> if_method("abc")
no, I'm not empty
=> nil
irb(main):006:0> if_method("")
=> nil
底下則是使用了unless
來做判斷
irb(main):007:0> def unless_method(arg2)
irb(main):008:1> return unless arg2.empty?
irb(main):009:1> puts "yes, I'm empty"
irb(main):010:1> end
=> :unless_method
irb(main):011:0> unless_method("abc")
=> nil
irb(main):012:0> unless_method("")
yes, I'm empty
=> nil
在if
的邏輯上,跟我們正常的思維上表達起來比較直觀
我們先判斷 arg1是否為空值? 這裡我們只會得到兩個答案true
orfalse
所以在這裡我若將arg1
代入 "abc",因為判斷空值的結果得到 false,
我們就得到了
no, I'm not empty
這邊看起來很理所當然,邏輯上也很順
如果arg1
不是空值(false),就繼續往下走,如果是空值(true)就 return 跳出。
再來是 unless 的部分,
我們一樣判斷arg2
是否為空值return unless arg2.empty?
語意上我可能會這樣解讀:
除非arg2
是空值那我就 return 跳出,如果不是空值,就繼續往下走
但當我們執行了:
irb(main):011:0> unless_method("abc")
=> nil
反而得不到我們想要的訊息?在這邊會陷入一個盲點。
我們再來看一次 unless 的部分
unless arg2.empty? # arg2 你是空值嗎?
irb(main):011:0> unless_method("abc") # 不,我不是,得到 false 所以 return
=> nil
irb(main):012:0> unless_method("") # 我是空值,得到 true 所以繼續往下走
yes, I'm empty
=> nil
unless = if not 我們也可以這樣來解讀
也就是先想成 if 的判斷邏輯,之後再將結果倒反過來,
映證了我們給arg2
代入空值時,才會繼續往下走,有值則 return,完全跟 if 相反。
希望能幫上卡住的人一點想法。