使用array的delete_if命令

时间:2013-05-19 06:27:19

标签: ruby arrays

让我们说,

script = Array.new
script.push("/home/dexter/constant.sh")
script.push("/home/dexter/constant_validation.rb")
script.push("/home/dexter/jobs/reporter.rb")

现在当我使用数组的delete_if方法时,

script.compact.delete_if {|s| s =~ /constant/}

这应该从包含“常量”的数组中删除元素。这是我在交互式ruby下执行它时得到的输出。

puts script => ["/home/dexter/jobs/reporter.rb"]

我在正则表达式匹配的帮助下将元素推入数组。

任何想法我做错了什么?

干杯。

4 个答案:

答案 0 :(得分:1)

虽然delete_if具有破坏性并且可以在消息接收器上工作,但由于您使用compact方法从self返回不同的实例,因此您发送delete_if消息的实例,与script不同。

因此,如果您运行script.compact!然后script.delete_if

,您将获得所需的结果

delete_if!本身修改delete_if以来,没有self

答案 1 :(得分:0)

script = Array.new
script.push("/home/dexter/constant.sh")
script.push("/home/dexter/constant_validation.rb")
script.push("/home/dexter/jobs/reporter.rb")

script
#=> ["/home/dexter/constant.sh",
 "/home/dexter/constant_validation.rb",
 "/home/dexter/jobs/reporter.rb"]

正如@shigeya上面所说,compact会返回self的不同实例。您可以将其验证为:

script.object_id
#=>72421740
script.compact.object_id
#=> 71512710

因此,通过在compact链中使用delete_if,您将对script.compact而不是script本身返回的对象数组进行更改,

`delete_if` **will** destruct the calling array
script.delete_if { |s| s =~ /constant/ }
=> ["/home/dexter/jobs/reporter.rb"]

script
=> ["/home/dexter/jobs/reporter.rb"]

答案 2 :(得分:0)

好的..所以我在剧本中所做的错误是,

我在正则表达式的帮助下在脚本数组中添加了元素。 因此,当我对数组的元素进行类检查时,发现它们的类型为“MatchData”,因此delete_if无效。

答案 3 :(得分:0)

如果你想在一行中完成它,它需要看起来像:

script.tap{|s| s.compact}.delete_if {|s| s =~ /constant/}

否则您的更改不会影响script