Хотя это и дольше, чем решение jtbandes, вам может понравиться это, поскольку оно немного более декларативно:
class Condition
attr_reader :service_name, :predicate
def initialize(service_name, &block)
@service_name = service_name
@predicate = block
end
end
CONDITIONS = [
Condition.new('ups') { |n| n[1] == 'Z' },
Condition.new('dhl') { |n| n[0] == 'Q' },
Condition.new('fedex') { |n| n[0..1] == '96' && n.size == 22 },
Condition.new('ups') { |n| n[0] == 'H' && n.size == 11 },
Condition.new('ups') { |n| n[0] == 'K' && n.size == 11 },
Condition.new('dhlgm') { |n| n.size == 17 },
Condition.new('usps') { |n| [13, 20, 22, 30].include?(n.size) },
Condition.new('fedex') { |n| [12, 15, 19].include?(n.size) },
Condition.new('dhl') { |n| [10, 11].include?(n.size) },
]
def tracking_service(tracking_number)
result = CONDITIONS.find do |condition|
condition.predicate.call(tracking_number)
end
result.service_name if result
end
Я не имел дело с вызовом метода check_response здесь, так как я чувствую, что вы, вероятно, должны обработать это в другом месте (предполагая, что он делает что-то иное, чем возвращает имя службы отслеживания).