Jaki jest cel "!"i"?"na końcu nazwy metody?
Czasami widzę metody w Ruby, które mają "?"i"!"na ich końcu, np.:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Zastanawiałem się, jaki jest ich cel? Czy to tylko słodzenie składni? 5 answers
To jest "po prostu słodkie" dla czytelności, ale mają one wspólne znaczenia:]}
-
metody kończące się na
!
wykonują pewną stałą lub potencjalnie niebezpieczną zmianę ; na przykład:-
Enumerable#sort
zwraca posortowaną wersję obiektu, podczas gdyEnumerable#sort!
sortuje go w miejscu. - w Rails,
ActiveRecord::Base#save
zwraca false, jeśli zapisanie nie powiodło się, podczas gdyActiveRecord::Base#save!
podnosi wyjątek. -
Kernel::exit
powoduje wyjście skryptu, podczas gdyKernel::exit!
robi to natychmiast, omijając dowolne wyjście pomocnicy.
-
-
metody kończące się
?
zwracają wartość logiczną , co sprawia, że kod płynie jeszcze bardziej intuicyjnie jak zdanie-if number.zero?
czyta się jak "jeśli liczba jest zerem", aleif number.zero
wygląda dziwnie.
W twoim przykładzie name.reverse
oblicza odwrócony łańcuch, ale dopiero po linii name.reverse!
zmienna name
faktycznie zawiera odwróconą nazwę. name.is_binary_data?
wygląda jak " czy name
dane binarne?".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-28 06:39:33
Znak zapytania wskazuje, że metoda zwraca wartość logiczną. Już tutaj:
Co oznacza operator znaku zapytania w Rubim?
Huk wskazuje, że metoda działa na sam obiekt. Już tutaj:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:44
W Rubim ?
oznacza, że metoda zwróci wartość logiczną, a !
modyfikuje obiekt, na którym została wywołana. Mają one na celu poprawę czytelności kodu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-24 16:34:13
W przeciwieństwie do – jak przypuszczam-większości języków programowania ...
Ruby, metody mogą kończyć się znakami zapytania lub wykrzyknikami.
Według konwencji, metody, które odpowiadają na pytania (np. tablica # empty? zwraca true jeśli odbiornik jest pusty) kończy się znakiem zapytania.
Potencjalnie "niebezpieczne" metody (tj. metody modyfikujące self lub argumenty, exit! itd.) według konwencji kończą się wykrzyknikami.
Od: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/, sekcja śmieszne nazwy metod
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-24 16:35:12
Uważaj, nie zawsze tak jest. Weźmy na przykład tablicę Ruby # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .
Gdzie można się mocno poparzyć jest coś w stylu MyActiveRecordModel.column_names.concat([url])
. Późniejsze wywołania związane z MyActiveRecordModel spróbują wyszukać kolumnę ' url ' dla MyActiveRecordModel I throw.
Zamiast tego musisz sklonować go przed wykonaniem konkatu. Na szczęście mój zestaw testów złapał tego, ale.. Uwaga!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-26 14:02:37