-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/}

これにより、「定数」を含む配列から要素が削除されます。これは、インタラクティブなルビーで実行したときに得られる出力です。

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

正規表現マッチングを使用して、要素を配列にプッシュしています。

私が間違っていることは何ですか?

乾杯。

4

4 に答える 4

1

whiledelete_ifは破壊的で、メッセージの受信側で動作しますが、compactとは異なるインスタンスを返すメソッドを使用するため、メッセージselfの送信先のインスタンスdelete_ifは とは異なりますscript

script.compact!したがって、次に実行すると、目的の結果が得られます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.compactscript

`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 に答える