2016-01-17 8 views

Odpowiedz

1

Kluczową różnicą jest to, że try! jest dodatkowym wywołaniem metody, podczas gdy &. nie jest. Mogę myśleć o jeden (co prawda contrived) Różnica ta tworzy

"1234"&.gsub(/\d/, "a") 
$& #=> "1234" 

bez niespodzianek tutaj - Zrobiłem mecz regex tak regex zmienne globalne są ustawione ($& jest dopasowany łańcuch).

Ale jeśli (w świeżej sesji IRB - to ważne) zrobić

"1234".try!(:gsub, /\d+/, "a") 
$& #=> nil 

Następnie globalne regex związane są zerowe. To dlatego, że te globale nie są tak naprawdę globalne - są powiązane z miejscem wywołania kodu (docs nazywa ten wątek i zmiennymi globalnymi z metody)

W tym przypadku $& wciąż jest ustawiany, ale jest ustawione w metodzie try!, więc nigdy jej nie widzisz.

Sposób dodatkowo rozmowa sprawia również try wolniejszy (prawie o rząd wielkości w szybkim teście), chociaż w każdym rzeczywistym wykorzystaniu kosztu rzeczywistego sposobu której dzwonisz powinny karzeł koszt try!