我有一个字符串数组。这个数组中的一些字符串包含我正在寻找的某个子字符串。我想得到一个包含子串的字符串数组。
我希望这样做:
a = ["abc", "def", "ghi"]
o.select(&:include?("c"))
但是这给了我这个错误:
(repl):2: syntax error, unexpected ')', expecting end-of-input
o.select(&:include?("c"))
^
答案 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_object
和some_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' }