红宝石 |可比模块
在 Ruby 中,Comparable 的mixin被对象可以被排序的类使用。必须使用将接收者与另一个对象进行比较的运算符来定义该类。它将根据接收者返回-1、0 和 1 。如果接收者小于另一个对象,则返回-1,如果接收者等于另一个对象,则返回0。如果接收者大于另一个对象,则返回1。可比模块使用<=>来实现常规的运算符(=,和>)和方法之间?
例子:
# Ruby program to illustrate
# comparable module
class Geeksforgeeks
# include comparable module
include Comparable
attr :name
def <=>(other_name)
name.length <=> other_name.name.length
end
def initialize(name)
@name = name
end
end
# creating objects
a1 = Geeksforgeeks.new("G")
a2 = Geeksforgeeks.new([3, 5])
a3 = Geeksforgeeks.new("geeks")
# using comparable operator
p a1 < a2
# using between? method
p a2.between?(a1, a3)
p a3.between?(a1, a2)
输出:
true
true
false
实例方法
- < :它根据接收者的方法比较两个对象,如果返回 -1 则返回 true,否则返回 false。
obj
- <= :它根据接收者的方法比较两个对象,如果返回 -1 或 0 则返回 true,否则返回 false。
obj<=other_obj
- == :它根据接收者的方法比较两个对象,如果返回 0 则返回 true,否则返回 false。
obj==other_obj
- > :它根据接收者的方法比较两个对象,如果返回 1 则返回 true,否则返回 false。
obj>other_obj
- >= :它根据接收者的方法比较两个对象,如果返回 1 或 0 则返回 true,否则返回 false。
obj>=other_obj
例子:
# Ruby program to illustrate # use of comparisons # defining class class Geeksforgeeks # include comparable module include Comparable attr :name def <=>(other_name) name.length <=> other_name.name.length end def initialize(name) @name = name end end # creating objects a1 = Geeksforgeeks.new("G") a2 = Geeksforgeeks.new("geeks") # using < operator p a1 < a2 # using <= operator p a1 <= a2 # using == operator p a1 == a2 # using >= operator p a1 >= a2 # using > operator p a1 > a2
输出:
true true false false false
- 之间? :如果 obj <=> min 小于或 obj <=> max 大于零,则此方法返回 false。否则,它返回真。
obj.between?(min, max)
例子:
# Ruby program to illustrate # use of between? method # using between? method p 7.between?(2, 6) p 'geeks'.between?('geeks', 'gfg')
输出:
false true
参考: https://ruby-doc.org/core-2.2.0/Comparable.html