如果情况更有效的红宝石

时间:2016-02-12 01:58:38

标签: ruby if-statement conditional

我想知道在多个条件下测试字符串的最佳方法是什么。

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 个答案:

答案 0 :(得分: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 }
})

为了改善这一点,最好在SASS中找到等效的arglist

-

参考文献: