如何最好地对 ruby 中带分数的字符串列表进行排序?

How to best sort a list of strings with fractions in ruby?

获取包含英寸符号的整数和分数的现有字符串列表:

['1"','1/2"','1 1/4"','1/4"','2"','1 1/8"']

在 ruby 中是否有最好的(rubyish,优雅,方法的使用,面向对象)排序方式使其成为

['1/4"','1/2"','1"','1 1/8"','1 1/4"','2"']

String#to_r 将方便地忽略尾随垃圾(例如 "):

The parser ignores leading whitespaces and trailing garbage.

因此,将 '1 1/2"' 之类的内容转换为可进行合理比较的数字是一件简单的事情:

s = '1 1/2"'
r = s.split.map(&:to_r).inject(:+)

将字符串拆分成多个部分,使用 String#to_r 将每个字符串转换为 Rational,然后使用带符号参数的 Enumerable#inject 将它们相加。干净简单。

一旦有了它,排序就很简单了:

array        = ['1"','1/2"','1 1/4"','1/4"','2"','1 1/8"']
rationalized = lambda { |s| s.split.map(&:to_r).inject(:+) }
sorted       = array.sort_by(&rationalized)

你当然不必使用 lambda:

array.sort_by { |s| s.split.map(&:to_r).inject(:+) }

但我发现命名您的小逻辑片段可以澄清事情。