Ruby从包含substring的数组中获取字符串

时间:2017-07-13 18:06:24

标签: ruby

我有一个字符串数组。这个数组中的一些字符串包含我正在寻找的某个子字符串。我想得到一个包含子串的字符串数组。

我希望这样做:

a = ["abc", "def", "ghi"]
o.select(&:include?("c"))

但是这给了我这个错误:

(repl):2: syntax error, unexpected ')', expecting end-of-input
o.select(&:include?("c"))
                        ^

3 个答案:

答案 0 :(得分:5)

如果您的数组是文件lines.txt

abc
def
ghi

然后,您将使用c命令行实用程序选择包含grep的行:

$ grep c lines.txt
abc

Ruby将此作为Enumerable#grep采用。您可以将正则表达式作为模式传递,并返回与此模式匹配的字符串:

['abc', 'def', 'ghi'].grep(/c/)
#=> ["abc"]

更具体地说,结果数组包含pattern === element为真的所有元素:

/c/ === 'abc' #=> true
/c/ === 'def' #=> false
/c/ === 'ghi' #=> false

答案 1 :(得分:4)

您可以在此处使用& - 简写。这是非常不合理的(不要这样做),但可能。

如果您确实找到了一个对象和一个方法,那么您可以在select中进行检查,如下所示:

o.select { |e| some_object.some_method(e) }

(重要的是some_objectsome_method在所有迭代中都必须相同)

...然后你可以使用Object#method来获得这样的块。它返回一些实现to_proc(需要& - 速记)的东西,并且当调用proc时,调用some_method上的some_object,将其参数转发给它。有点像:

o.m(a, b, c) # <=> o.method(:m).to_proc.call(a, b, c)

以下是& - 简写:

的使用方法
collection.select(&some_object.method(:some_method))

在这种特殊情况下,/c/及其方法=~完成工作:

["abc", "def", "ghi"].select(&/c/.method(:=~))

有点冗长,可读性相对较差 再一次,不要在这里这样做。但这个技巧在其他情况下可能会有所帮助。

答案 2 :(得分:2)

你几乎就在那里,你无法在&:传递参数。你可以这样做:

o.select{ |e| e.include? 'c' }