Я бы использовал рекурсивный метод с обратными вызовами.
Поскольку вы пытаетесь оценить 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:
Если вы заботитесь об эффективности с последним битом, не используйте методы Rails. Почему вы не используете обычный 'include? '? То, что вы делаете, не имеет смысла. – sawa
То, что у вас хорошо выглядит для меня (кроме использования 'include?'). Если «then do all this stuff» short, вы можете написать '<, а затем все эти вещи>, если this.include? (" A ")' или '<, а затем делать все это> если this.include? (" Z ") ' –
может быть выполнено более 1 условия? – MZaragoza