这就是我一直在做的事情:
my_array.reject { |elem| elem =~ /regex/ }.each { ... }
Run Code Online (Sandbox Code Playgroud)
我觉得这有点笨拙,但我还没有找到任何可以让我改变它的东西 my_array.grepv /regex/ { ... }
有这样的功能吗?
PJS*_*and 13
Ruby 2.3实现的Enumerable#grep_v
方法正是您所追求的.
https://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-grep_v
你知道Symbol#to_proc
链接有什么帮助吗?你可以用正则表达式做同样的事情:
class Regexp
def to_proc
Proc.new {|string| string =~ self}
end
end
["Ruby", "perl", "Perl", "PERL"].reject(&/perl/i)
=> ["Ruby"]
Run Code Online (Sandbox Code Playgroud)
但你可能不应该这样做.Grep不仅适用于正则表达式 - 您可以像下面这样使用它
[1,2, "three", 4].grep(Fixnum)
Run Code Online (Sandbox Code Playgroud)
如果你想grep -v,你必须实现Class#to_proc
,这听起来是错误的.
这个怎么样?
arr = ["abc", "def", "aaa", "def"] arr - arr.grep(/a/) #=> ["def", "def"]
我特意包含了一个 dup 以确保所有这些都被退回。
尝试使用Array#collect!
my_array.collect! do |elem|
if elem =~ /regex/
# do stuff
elem
end
end
Run Code Online (Sandbox Code Playgroud)
编辑:抱歉,那么您必须Array#compact
稍后再打电话。至少这会消除第二个区块。但它更多的是物理代码。这取决于你做了多少“事情”。
归档时间: |
|
查看次数: |
4657 次 |
最近记录: |