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#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 gdy ActiveRecord::Base#save!
wywołuje wyjątek.Kernel::exit
powoduje 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.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 po name.reverse!
wierszu . wygląda na to, że „czy dane binarne?”.name
name.is_binary_data?
name
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:
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!