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?
 87
Author: Mischa, 2011-08-24

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 gdy Enumerable#sort! sortuje go w miejscu.
    • w Rails, ActiveRecord::Base#save zwraca false, jeśli zapisanie nie powiodło się, podczas gdy ActiveRecord::Base#save! podnosi wyjątek.
    • Kernel::exit powoduje wyjście skryptu, podczas gdy Kernel::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", ale if 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?".

 141
Author: jtbandes,
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:

Dlaczego wykrzykniki są używane w metodach Ruby?

 13
Author: Bill,
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.

 7
Author: J Lundberg,
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

 5
Author: miku,
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!

 0
Author: wintondeshong,
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