2016-02-12 20 views
1

我想知道什麼最好的方法是測試多個條件的字符串。更高效的紅寶石,如果情況下

this = "allthisstuff" 

if this.include?("a") 
    # then do all this stuff 
end 
if this.include?("f") 
    # then do all this stuff too 
end 
if this.include?("s") 
    # also do all this stuff 
end 

是否有這樣做的更有效的方式,或堆放if語句的最佳選擇嗎?

+1

如果您關心的是最後一點的效率,請不要使用Rails方法。你爲什麼不使用普通的'include?'?你在做什麼沒有意義。 – sawa

+1

你對我看起來很好(除了使用'include?')。如果「那麼做所有這些東西」很短,如果this.include?(「a」)或者'<那麼做所有這些東西>除非this.include?(「z」 )' –

+0

可以超過1個條件成立嗎? – MZaragoza

回答

0

我想用回調的遞歸方法。


既然你要評估String,你會是最好延長String類:

#config/initializers/string.rb #-> should be in /lib 
class String 
    def has? *letters 
    letters.each do |letter| 
     yield letter, self.include?(letter) 
    end 
    end 
end 

#app 
this = "allthisstuff" 
this.has?("a", "f", "s", "d") { |letter,result| puts "#{letter} #{result}" } 

# -> a true 
# -> f true 
# -> s true 
# -> d false 

以上將允許你使用一個單獨的塊,通過它,你會能夠評估通過letter

this.has?("a", "f", "s") do |letter,result| 
    if result 
    case letter 
     when "a" 
     # do something 
     when "f" 
     # do something 
    end 
    end 
end 

-

如果你想包含單獨的塊(JS完全可行),你會想看看「回調」。儘管回調不屬於Ruby方式嚴格一部分,你可以做到這一點:

#config/initializers/string.rb 
class String 
    def has? **letters 
    letters.each do |letter,lambda| 
     lambda.call(letter.to_s, self.include?(letter.to_s)) 
    end 
    end 
end 

#app 
this.has?({ 
    a: Proc.new {|letter,result| # do something }, 
    b: Proc.new {|letter,result| # do something else } 
}) 

爲了改善這一點,那將是最好找的arglist等值SASS

-

參考文獻:

+0

簡單地做'%w(a f s).each {| letter |如果this.include?(letter)...}'?我沒有看到在這裏擴展'String'的必要性。 – Mischa

+0

我建議擴展'String',因爲op問'this.include? ....'。可能很容易成爲模型,但每次'擁有時都必須傳遞eval對象?這個,「一個」。 –

+0

你的方法的問題是你將不得不在塊中評估。因此,如果OP要測試10個字母,則必須在每個塊中包含每個邏輯。雖然我的第一個建議是一樣的,第二個允許個別回調方法 –