iT邦幫忙

1

if、unless 語法矛盾? in Ruby村

在接觸正式專案後,常常會對一些 code 不甚理解,
尤其是在邏輯判斷,感到苦手,所以想紀錄一下究竟ifunless該怎麼去理解

底下定義了兩個簡單的方法,分別使用了ifunless來判斷,我們看看得到了什麼不同的結果?

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是否為空值? 這裡我們只會得到兩個答案trueorfalse
所以在這裡我若將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 相反。
希望能幫上卡住的人一點想法。


尚未有邦友留言

立即登入留言