如何简化包括子串检查

时间:2014-05-19 02:49:55

标签: ruby

现在,我需要在

中编写逻辑
if STR.include? "week" or STR.include? "precourse" or STR.include? "hi"
 do somthing
end

还有更优雅的方式吗?

3 个答案:

答案 0 :(得分:2)

您可以通过将令牌放入数组并使用reduce累积是否可以在STR中找到任何内容来消除重复的包含检查:

tokens = ['week', 'precourse', 'hi']
do_thing if tokens.reduce(false) {|y, v| y || STR.include?(v) }


说明:

do_thing if tokens.reduce(false) {|y, v| y || STR.include?(v) }
^                         ^        ^  ^  ^
a                         b        c  d  e
  • a。调用方法(“do somthing” 如果 减少评估为真
  • b。为reduce提供初始值以播种结果;我们从false
  • 开始
  • c。调用累加器值y;它收集每个包含检查的结果
  • d。调用数组项值v;它是我们传递给include?
  • 的令牌
  • e。逻辑OR累计值与当前令牌调用STR.include?的结果

答案 1 :(得分:0)

它是什么语言?

恕我直言,带有一些论点的if语句可能是唯一的方法。

我会在java中做什么。

String something = "Pizza Pie";

if (something.contains("Pizza") || something.contains("Pie")) {
    System.out.println("Yarp");
}

答案 2 :(得分:0)

  

还有更优雅的方式吗?

是的,但这取决于str变量中的内容。

  1. 因为您使用的是include?而不是==,所以这可能不适合您:

    if ['week', 'precourse', 'hi'].include? str
    

    str必须是数组中的其中一项。

  2. 但如果str比数组中的项目长,则可以执行以下操作:

    if str.match /week|precourse|hi/
    
  3. 为了避免在你的正则表达式中对这些字符串进行硬编码,你可能会有点麻烦:

    target_strs = %w{ week precourse hi }
    p target_strs  #=> ["week", "precourse", "hi"]
    
    str = "Hello and hi"
    
    if str[ Regexp.union(target_strs) ]  #=> str[ /week|precourse|hi/ ]
      puts 'yes'
    end
    
    --output:--
    ["week", "precourse", "hi"]
    yes
    

    使用正则表达式时,请参阅字符串#[]的文档:http://www.ruby-doc.org/core-2.1.2/String.html#method-i-5B-5D

  4. 你做的方式没有错,而且阅读起来也比较容易。 :)