在接触正式专案后,常常会对一些 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_methodirb(main):005:0> if_method("abc")no, I'm not empty=> nilirb(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_methodirb(main):011:0> unless_method("abc")=> nilirb(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=> nilirb(main):012:0> unless_method("") # 我是空值,得到 true 所以继续往下走yes, I'm empty=> nil
unless = if not 我们也可以这样来解读
也就是先想成 if 的判断逻辑,之后再将结果倒反过来,
映证了我们给arg2
代入空值时,才会继续往下走,有值则 return,完全跟 if 相反。
希望能帮上卡住的人一点想法。