-2

可以说,

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

4 回答 4

1

虽然delete_if具有破坏性并且对消息接收器起作用,但由于您使用从 .compact返回不同实例的方法self,因此您向其发送delete_if消息的实例与script.

所以,如果你运行script.compact!then ,你会得到想要的结果script.delete_if

本身没有修改delete_if!delete_ifself

于 2013-05-19T07:02:34.130 回答
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

因此,通过使用compactin chain with 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"]
于 2013-05-19T07:14:49.457 回答
0

好的..所以我在脚本中犯的错误是,

我在正则表达式的帮助下将元素添加到脚本中的脚本数组中。因此,当我对数组的元素进行类检查时,我发现它们属于“MatchData”类型,因此 delete_if 不起作用。

于 2013-05-19T07:26:17.977 回答
0

如果您想在一行中执行此操作,则需要如下所示:

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

否则您的更改不会影响script.

于 2013-05-19T09:15:30.547 回答