Ruby Ruby 中的谓词

towonzhou · 2013年08月15日 · 最后由 dddd1919 回复于 2013年08月15日 · 2638 次阅读

经常看到这样的代码

if x % 2 == 0 ...

显然 Fixnum#even? 是更好的选择

if x.even? ...

当然,判断一个数是否是奇数的时候可以用Fixnum#odd?
也常看到这样的

if x > 0 && x < 7

这样没有什么错误,但个人觉得between?会更好一些,显得更面向对象一些

if x.between?(1..6)

也可用使用区间来用作排除

if x > 0 && x < 1000 ...

#is the same as
if (1...1000).include?(x) ...

用这种谓词的方法有些小细节需要注意: 比如

if arr = [] ...

不能用if arr.empty?代替 因为 arr 可能是 nil,所以得

if !arr.nil? && arr.empty?

当然判断 nil 最好的方法还是

if something ...

... 楼主说的当然没错,问题是 记不住/不知道 啊。要是知道有 #between 谁会去用 < && > 呢...

#1 楼 @blacktulip 这个就得从思想上去入手了,比如 between,不应该想的是大于 0,小于 7,应该想在 0 和 7 之间,这种 ruby 一般会有方法,然后看文档呗

每次在定义 adjective? 这样的方法时,我总在纠结是 is_adjective? 还是 adjective? ,明明是前者更好读啊(我在用嘴 Coding)!

#3 楼 @fenprace 纠结的时候可以参考 Ruby 内建的一些方法,比如 is_a? 后面是一个类名(名词) ,eql? 本身是个判断,还有 kind_of?,respond_to? 这种,认真一点的话,感觉像是在考英文功底。

很好的普及帖,对我有帮助

#3 楼 @fenprace object.is_objective? 明显是要带 is 更顺口……除非说的不是英语

if !arr.nil? && arr.empty? 在各个项目中见过很多类似的代码,其实前面那个判断完全可以省掉,只要规定 arr 不能为 nil,只允许为 [] 就好了。写个 Teacher#students 方法如果结果有可能返回 nil 而不是 [],这个代码我觉得就是不合格的。空数组可以当 Array 的一个简单的 NullObject。

先从 XXX.methods筛一遍再说

需要 登录 后方可回复, 如果你还没有账号请 注册新账号