Czy bezpieczny operator &.
z wersji Ruby 2.3 i try!
z ActiveSupport są wymienne? Jeśli nie, jakie są między nimi różnice?Jakie są różnice między bezpiecznym nawigatorem Ruby 2.3 "&. i "spróbuj!" metoda z ActiveSupport?
Odpowiedz
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!
http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/ ma wszystko, co musisz wiedzieć. –
TLDR: w większości przypadków są one praktycznie wymienne, ale jest kilka subtelności, o których powinieneś wiedzieć. –