如何在块内使用条件变量

时间:2017-03-14 20:57:59

标签: ruby

如何在返回值中使用条件的var string

lines = ["dyfögifuödxfghif", "xdghödfx", "abcdefg"]
strings = ["abc", "zzzzzzzzz"]
lines.each do |line|
    if strings.any? { |string| line.include?(string) }
        return string
    end
end
return nil

数据类型:

lines:Array, line:String, strings:Array, string:String

期望的结果:

=> "abc"

我正在迭代很多行,如果它们在名为strings - >的数组中包含一个字符串,则想要检查它们中的每一行。直到我找到匹配或完成迭代。

此代码段 有效,但它执行相同的操作两次

lines.each do |line|
    if strings.any? { |string| line.include?(string) }
        return strings.detect { |string| line.include?(string) }
    end
end
return nil

4 个答案:

答案 0 :(得分:2)

您可以使用detect

return strings.detect { |string| lines.any? { |line| line.include?(string) } }

答案 1 :(得分:2)

你可以使用.find和一些正则表达式来恢复第一场比赛

strings.find {|word| lines.find {|line| line =~ /#{word}/ } }
=> "abc"


# if you want all matches 
strings.select {|word| lines.find {|line| line =~ /#{word}/  } }
=> ["abc"]

答案 2 :(得分:1)

如果你想要第一场比赛:

strings.detect { |string| line.include?(string) }

如果你想要所有匹配(在一个数组中):

strings.select { |string| line.include?(string) }

答案 3 :(得分:0)

如果编译要匹配的紧凑正则表达式的字符串列表,则可以非常轻松地执行此操作:

string_rx = Regexp.union(strings)

然后你所要做的就是过滤掉匹配的行并拉出第一行:

lines.grep(string_rx).first
# => "abcdefg"

如果您不想处理整个阵列并对其进行优化以提高性能:

lines.lazy.grep(string_rx).first
# => "abcdefg"

lazy指示符使每个条目流经链完成,而不是每个阶段缓冲,然后传递到下一个。