Dla czytelności to „tylko cukierkowa powłoka”, ale mają one wspólne znaczenie:
Metody kończące się !wprowadzeniem trwałej lub potencjalnie niebezpiecznej zmiany ; na przykład:
Enumerable#sortzwraca posortowaną wersję obiektu, Enumerable#sort!sortując go w miejscu.
W Railsach ActiveRecord::Base#savezwraca wartość false, jeśli zapisywanie się nie powiodło, podczas gdy ActiveRecord::Base#save!wywołuje wyjątek.
Kernel::exitpowoduje zakończenie działania skryptu, podczas gdy Kernel::exit!robi to natychmiast, pomijając wszelkie programy obsługi wyjścia.
Metody kończące się ?zwracają wartość logiczną , co sprawia, że kod płynie jeszcze bardziej intuicyjnie jak zdanie - if number.zero?brzmi jak „jeśli liczba wynosi zero”, ale if number.zeropo prostu wygląda dziwnie.
W twoim przykładzie name.reversezwraca odwrócony ciąg znaków, ale zmienna faktycznie zawiera odwróconą nazwę dopiero po name.reverse!wierszu . wygląda na to, że „czy dane binarne?”.namename.is_binary_data?name
Jedną z ważnych uwag jest to, że powinieneś mieć metodę huk tylko wtedy, gdy masz również odpowiednią metodę bez huku. Huk służy do odróżnienia „bardziej zaskakującej” wersji metody od „mniej zaskakującej”. Jeśli masz tylko jedną metodę, nie ma potrzeby rozróżniania i nie powinieneś nazywać jej z hukiem. Zobacz Array#clearna przykład. Czyści tablicę. Wyczyszczenie tablicy powoduje jej naturalną mutację. Nie ma w tym nic dziwnego, nazwa już to wyjaśnia, dlatego: bez huku. Zobacz ruby-forum.com/topic/176830#773946 .
Jörg W Mittag
2
Dodając do tego, co powiedział @ JörgWMittag, zgodnie z Przewodnikiem po stylu Ruby : Nazwy potencjalnie niebezpiecznych metod (tj. Metod, które modyfikują siebie lub argumenty, zakończ! (Nie uruchamia finalizatorów jak exit) itp.) Powinny kończyć się wykrzyknik, jeśli istnieje bezpieczna wersja tej niebezpiecznej metody .
Tod Birdsall
2
Uważaj, nie zawsze tak jest. Na przykład Ruby Array # concat docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat . Tam, gdzie można się poważnie spalić, jest coś takiego jak MyActiveRecordModel.column_names.concat (...). Zamiast tego musisz go sklonować przed wykonaniem konkatacji.
wintondeshong
15
Znak zapytania wskazuje, że metoda zwraca wartość logiczną. Odpowiedziałem już tutaj:
W Rubim ?oznacza, że metoda zwróci wartość logiczną i !zmodyfikuje obiekt, na którym została wywołana. Są po to, aby poprawić czytelność podczas przeglądania kodu.
Gdzie możesz się poważnie poparzyć, to coś takiego MyActiveRecordModel.column_names.concat([url]). Późniejsze wywołania związane z MyActiveRecordModel będą próbowały wyszukać kolumnę „url” dla MyActiveRecordModel i throw.
Zamiast tego musisz go sklonować przed wykonaniem konkatacji. Na szczęście mój zestaw testów złapał ten jeden, ale… uwaga!
Odpowiedzi:
Dla czytelności to „tylko cukierkowa powłoka”, ale mają one wspólne znaczenie:
!
wprowadzeniem trwałej lub potencjalnie niebezpiecznej zmiany ; na przykład:Enumerable#sort
zwraca posortowaną wersję obiektu,Enumerable#sort!
sortując go w miejscu.ActiveRecord::Base#save
zwraca wartość false, jeśli zapisywanie się nie powiodło, podczas gdyActiveRecord::Base#save!
wywołuje wyjątek.Kernel::exit
powoduje zakończenie działania skryptu, podczas gdyKernel::exit!
robi to natychmiast, pomijając wszelkie programy obsługi wyjścia.?
zwracają wartość logiczną , co sprawia, że kod płynie jeszcze bardziej intuicyjnie jak zdanie -if number.zero?
brzmi jak „jeśli liczba wynosi zero”, aleif number.zero
po prostu wygląda dziwnie.W twoim przykładzie
name.reverse
zwraca odwrócony ciąg znaków, ale zmienna faktycznie zawiera odwróconą nazwę dopiero poname.reverse!
wierszu . wygląda na to, że „czy dane binarne?”.name
name.is_binary_data?
name
źródło
Array#clear
na przykład. Czyści tablicę. Wyczyszczenie tablicy powoduje jej naturalną mutację. Nie ma w tym nic dziwnego, nazwa już to wyjaśnia, dlatego: bez huku. Zobacz ruby-forum.com/topic/176830#773946 .Znak zapytania wskazuje, że metoda zwraca wartość logiczną. Odpowiedziałem już tutaj:
Co oznacza operator znaku zapytania w języku Ruby?
Huk wskazuje, że metoda działa na sam obiekt. Odpowiedziałem już tutaj:
Dlaczego w metodach Rubiego używane są wykrzykniki?
źródło
W Rubim
?
oznacza, że metoda zwróci wartość logiczną i!
zmodyfikuje obiekt, na którym została wywołana. Są po to, aby poprawić czytelność podczas przeglądania kodu.źródło
W przeciwieństwie do - jak sądzę - większości języków programowania ...
Od: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , sekcja Śmieszne nazwy metod
źródło
?
się na nazywane są metodami predykatowymi.Uważaj, nie zawsze tak jest. Weźmy na przykład Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .
Gdzie możesz się poważnie poparzyć, to coś takiego
MyActiveRecordModel.column_names.concat([url])
. Późniejsze wywołania związane z MyActiveRecordModel będą próbowały wyszukać kolumnę „url” dla MyActiveRecordModel i throw.Zamiast tego musisz go sklonować przed wykonaniem konkatacji. Na szczęście mój zestaw testów złapał ten jeden, ale… uwaga!
źródło