让我们说,
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"]
我在正则表达式匹配的帮助下将元素推入数组。
任何想法我做错了什么?
干杯。
答案 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
。