2016-02-12 3 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?'). Если «then do all this stuff» short, вы можете написать '<, а затем все эти вещи>, если 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

-

Refs:

+0

Какая польза от этого просто выполняется '% w (a f s) .each {| letter | if this.include? (letter) ...} '? Я не вижу необходимости расширения 'String' здесь. – Mischa

+0

Я рекомендовал расширенный 'String', потому что op спросил' this.include? .... '. Легко ли быть моделью, но нужно будет каждый раз передавать объект eval? это «a». –

+0

Проблема с вашим методом заключается в том, что вам придется оценивать в блоке. Поэтому, если OP хочет протестировать 10 букв, вам нужно будет включить логику для каждого из них внутри одного блока. Хотя моя первая рекомендация делает то же самое, вторая позволяет использовать отдельные методы обратного вызова –

Смежные вопросы