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_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是否为空值? 这里我们只会得到两个答案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=> nilirb(main):012:0> unless_method("") # 我是空值,得到 true 所以继续往下走yes, I'm empty=> nil

unless = if not 我们也可以这样来解读
也就是先想成 if 的判断逻辑,之后再将结果倒反过来,
映证了我们给arg2代入空值时,才会继续往下走,有值则 return,完全跟 if 相反。
希望能帮上卡住的人一点想法。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章