如何压缩和提高此循环的性能?

时间:2016-09-08 11:38:56

标签: ruby-on-rails ruby

Ruby on Rails: 从URL我想获得一个特定的值,我正在检查包含该值的URL是否使用数组。如果它具有该值,我将拆分URL并返回值。

@url = 'http://fruits.com/A15/abc1234-apple-w740_h550_q58.jpg'

['apple','banana','grape','butter','honey'].each do |fruit|
  if (@url.include? fruit) 
    return @url.split(fruit)[1].freeze 
  end
end

我不想循环5次.. 问题是如何压缩这个循环。

3 个答案:

答案 0 :(得分:3)

您可以将正则表达式传递给String#split

@url = 'http://fruits.com/A15/abc1234-apple-w740_h550_q58.jpg'

@url.split(/apple|banana|grape|butter|honey/)[1]
#=> "-w740_h550_q58.jpg"

或者,使用String#[]

@url[/(apple|banana|grape|butter|honey)(.*)/, 2]
#=> "-w740_h550_q58.jpg"

或者,使用positive lookbehind来避免第二个论点:(帽子提示为mudasobwa)

@url[/(?<=apple|banana|grape|butter|honey).*/]
#=> "-w740_h550_q58.jpg"

答案 1 :(得分:2)

试试这个:

url = 'http://fruits.com/A15/abc1234-apple-w740_h550_q58.jpg'

['apple','banana','grape','butter','honey'].select { |f| url.include? f }

答案 2 :(得分:1)

这个应该有效:

@url = 'http://fruits.com/A15/abc1234-apple-w740_h550_q58.jpg'

def last_part_of_url
  fruit = ['apple','banana','grape','butter','honey'].detect { |f| @url.include?(f) }
  @url.split(fruit).last if fruit
end