我只是在学习Ruby,并开始使用数组。我有一个数组,看起来像:
easyStats = [<SampleArray: @id=0, @stats=#<OpenStruct total_sessions_played=244, total_sessions_lost=124>>,
<SampleArray: @id=1, @stats=#<OpenStruct total_sessions_played=204, total_sessions_lost=129>>,
<SampleArray: @id=2, @stats=#<OpenStruct total_sessions_played=2, total_sessions_lost=4>>]我可以将数组按id (Integer)属性排序如下:
easyStats.sort_by(&:id)但是,我想要做的是根据OpenStruct对象的一个键对数组进行排序,我尝试了以下带有不同错误的选项:
easyStats.sort_by(&:stats)错误: OpenStruct与OpenStruct的比较失败
easyStats.sort_by(&:stats[:total_sessions_played])错误:没有将符号隐式转换为整数
easyStats[:stats].sort_by(&:total_sessions_played)错误:没有将符号隐式转换为整数
我已经看到了如何对一个OpenStruct对象的数组排序的解决方案,我想我理解它- How to sort a ruby array by two conditions。
在这个例子中,有人能告诉我如何按OpenStruct对象的任意键排序( Integer和OpenStruct对象的数组)吗?
发布于 2016-06-19 15:15:51
sort_by方法接受一个块并使用该块的返回值作为排序的键。在您的示例中,您可以通过执行以下操作来访问该值:
easyStats.sort_by { |i| i.stats.total_sessions_played }.sort_by(&:key)代码实际上只是.sort_by { |i| i.key }的缩写。只有当块由块参数上调用的单个方法组成时,才能使用它。您可以阅读更多关于它如何和为什么工作的here。
发布于 2016-06-19 15:04:18
您应该提供一个实际的块(因为您连续地对每个项调用两个方法):
easyStats.sort_by{|x| x.stats.total_sessions_played}因此,您不能在这里使用&的简短表示法。
https://stackoverflow.com/questions/37908601
复制相似问题