Ruby中如何将比较运算符作为方法参数?实现通用数组排序判断
在Ruby中传递比较运算符作为方法参数的最优方式
你想要为数组实现一个通用的sorted?判断方法,能传入<=、>=这类比较运算符来复用逻辑,这个思路完全正确——把重复的升序/降序判断逻辑抽象成通用方法,能大大减少代码冗余。
核心思路:Ruby的运算符本质是方法
在Ruby里,所有的运算符(包括比较运算符)其实都是对象的方法。比如a <= b本质上就是a.send(:<=, b)的语法糖。所以我们可以直接把运算符对应的Symbol(比如:<=、:>=)作为参数传递给方法,再通过send来动态调用这个比较方法。
优化后的最终实现
你最终的解决方案已经非常优雅了,这里再整理一下并解释关键细节:
class Array def sorted? return 1 if sorted_generic?(:<=) return -1 if sorted_generic?(:>=) 0 end def sorted_generic?(comparison) return true if length < 2 self[0].send(comparison, self[1]) && self.drop(1).sorted_generic?(comparison) end end
代码关键点解释:
- 通用方法
sorted_generic?:接收一个comparison参数,这个参数是比较运算符对应的Symbol(:<=对应升序判断,:>=对应降序判断) - 边界条件处理:当数组长度小于2时(空数组或单个元素),直接返回
true,因为这类数组天然是有序的 - 递归逻辑:通过
self[0].send(comparison, self[1])动态调用指定的比较方法,然后递归检查去掉第一个元素后的子数组,确保整个数组都满足排序规则 - 上层方法
sorted?:复用通用方法,分别判断升序和降序,返回对应的标识(1表示升序,-1表示降序,0表示无序)
额外补充:块的实现方式(可选)
如果你偏好使用块来传递逻辑,也可以写成这样,灵活性更强,适合更复杂的比较逻辑:
class Array def sorted? return 1 if sorted_generic? { |a, b| a <= b } return -1 if sorted_generic? { |a, b| a >= b } 0 end def sorted_generic?(&block) return true if length < 2 block.call(self[0], self[1]) && self.drop(1).sorted_generic?(&block) end end
不过对于简单的比较运算符来说,直接传递Symbol+send的方式更简洁直观,也是这类场景下的最优选择。
内容的提问来源于stack exchange,提问作者wintermute
相关产品推荐
相关产品推荐

