Czasami widzę metody w Rubim, które mają znak „?” i "!" na końcu z nich np .:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Zastanawiałem się, jaki jest ich cel? Czy są po prostu cukrową powłoką składniową?
Czasami widzę metody w Rubim, które mają znak „?” i "!" na końcu z nich np .:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Zastanawiałem się, jaki jest ich cel? Czy są po prostu cukrową powłoką składniową?
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#sortzwraca posortowaną wersję obiektu, Enumerable#sort!sortując go w miejscu.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.?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
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 .
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:
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.
W przeciwieństwie do - jak sądzę - większości języków programowania ...
Ruby, metody mogą kończyć się znakami zapytania lub wykrzyknikami.
Zgodnie z konwencją metody odpowiadające na pytania (tj. Tablica # pusta? Zwraca prawdę, jeśli odbiorca jest pusty) kończą się znakami zapytania.
Potencjalnie „niebezpieczne” metody (tj. Metody, które modyfikują siebie lub argumenty, wyjście! Itp.) Zgodnie z konwencją kończą się wykrzyknikami.
Od: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , sekcja Śmieszne nazwy metod
?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!