gpt4 book ai didi

ruby - 在 Ruby 中链接两个比较 <=> 运算符的任何简单方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:22:49 24 4
gpt4 key购买 nike

Ruby 自带方便的 <=>比较运算符和原生原始类型支持它们。我想知道是否有一种简单的方法可以将它们组合起来以比较更复杂的对象,例如 Structs。例如,给定

class Datum < Struct.new(:code, :volume); end

datum1 = Datum.new('B',10)
datum2 = Datum.new('A',10)
datum3 = Datum.new('C',11)

data = [datum1, datum2, datum3]

我想对 data 进行排序通过 volume然后,如果volume s 相等,由 code .喜欢

data.sort {|a,b| (a.volume <=> b.volume) ??? (a.code <=> b.code)}

我应该在 ??? 中输入什么? ?

我正在寻找一个解决方案:

  • 避免重新计算 <=>
  • 一行
  • 简短;-)

最佳答案

对于上面概述的这种简单情况,您可以使用 sort_by :

data.sort_by {|a| [a.volume, a.code] }
#=> [
# #<struct Datum code="A", volume=10>,
# #<struct Datum code="B", volume=10>,
# #<struct Datum code="C", volume=11>
# ]

如果您只按单个属性排序,它会变得更短:

data.sort_by(&:volume)
#=> [
# #<struct Datum code="B", volume=10>,
# #<struct Datum code="A", volume=10>,
# #<struct Datum code="C", volume=11>
# ]

哪里&:volume使用 Symbol#to_procproc {|a| a.volume } 的简写(类似于 lambda)。

如果您需要使其更复杂(即左侧和右侧不同),您可以将其扩展为对 sort 的调用:

data.sort {|a,b| [a.volume, a.code] <=> [b.volume, b.code] }
#=> [
# #<struct Datum code="A", volume=10>,
# #<struct Datum code="B", volume=10>,
# #<struct Datum code="C", volume=11>
# ]

这一切都有效,因为 <=>Array 上定义的运算符在任意级别上完全满足您的需求。

关于ruby - 在 Ruby 中链接两个比较 <=> 运算符的任何简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24378039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com