获取包含英寸符号的整数英寸字符串的现有字符串列表:
['1"','1/2"','1 1/4"','1/4"','2"','1 1/8"']
是否有最好的(红宝石,优雅,使用方法,面向对象)方式在红宝石中进行排序,以便它成为
['1/4"','1/2"','1"','1 1/8"','1 1/4"','2"']
答案 0 :(得分:4)
String#to_r
将方便地忽略尾随垃圾(例如"
):
解析器忽略前导空格和尾随垃圾。
将'1 1/2"'
这样的内容转换为可以合理比较的数字只是一个简单的问题:
s = '1 1/2"'
r = s.split.map(&:to_r).inject(:+)
将字符串拆分为多个部分,使用Rational
将每个字符串转换为String#to_r
,然后使用带有符号参数的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(:+) }
但我发现命名你的小逻辑片段可以澄清事情。