2017-06-02 10 views
0

私は特別な変数$'と方法MatchData#post_matchを比較しています。特別な変数は正常に動作しますが、メソッドpost_matchは失敗します。Ruby MatchData post_match予期しない動作

これは正常に動作します:

m = /b/.match("abc") 
# => #<MatchData "b"> 
m.post_match 
# => "c" 

"abc".match(/b/) 
# => #<MatchData "b"> 
$' 
# => "c" 

これは失敗します。

"abc".match(/b/) 
# => #<MatchData "b"> 
MatchData.post_match 
# => NoMethodError: undefined method `post_match' for MatchData 

私は同じ出力'c'を期待しています。なぜそれは失敗するのですか?私は何が欠けていますか?

+2

クラス 'MatchData'で' post_match'を呼び出していますが、クラスメソッドではありません。あなたは 'MatchData'のインスタンスで呼び出す必要があります。 – katafrakt

+0

ありがとう!だから、特別な変数$ 'が良いと思われます。 post_matchが優れている良い例は何でしょうか?マジックがSpecial Variablesで舞台裏で起こった場合、なぜMatchDataオブジェクトを作成するのですか? – Adam

+1

マジックは良い開発者の最初の敵であり、一般的に悪です。 – mudasobwa

答えて

1

matchdataのインスタンスでpost_matchに電話する必要があります。 $接頭辞

match_data = "abc".match(/b/) 
# => #<MatchData "b"> 
match_data.post_match 
# => "c" 

グローバル変数は取り扱いが困難です。それはどこでも変更することができ、それを追跡することは困難です。さらに、変数$'は、正規表現マッチを行うたびに変更され続けます。これはネストされたループで正規表現マッチを行うときに問題になることがあります。内側のループで何かをするたびに、外側のループで最後のマッチを台無しにすることができます。およびその逆。または、別の試合をした後で以前の試合を参照したい場合は、困っています。

マッチデータインスタンスを持つことで、それをローカル変数として割り当て、複雑な状況で複数のマッチデータを記録することができます。

+0

ありがとう - 今私はそれを得る... – Adam