2012-06-19 16 views
5

Pomyślałem, że zgodnie z konwencją tylko metody z wykrzyknikiem zmieniły obiekt.Dlaczego popowa metoda Array nie ma wykrzyknika?

> array = [1, 2, 3] 
=> [1, 2, 3] 
> array.pop 
=> 3 
> array 
=> [1, 2] 

Dlaczego nie jest Array „s pop metoda nazywa pop!?

+0

jestem z Mauricio- - po prostu nie jest to zaskakujące; ty strzelasz. To, że struktura jest aktualizowana, jest niejawne. –

Odpowiedz

11

To nie do końca poprawne.

Od The Ruby Style Guide

Nazwy potencjalnie „niebezpiecznych” metod (tj metody, które modyfikują siebie lub argumenty, zjazd! (Nie uruchamiać finalizatory jak zjazd robi), itd.) Powinny kończyć się wykrzyknik, jeśli istnieje bezpieczna wersja tej niebezpiecznej metody .

A nazwa metody pop mówi dokładnie, co robi, więc nie trzeba jej podpisywać wykrzyknikiem.

1

Konwencja ta jest nadal ważna, ale pop jest dobrze znana metoda ze wszystkich implementacjach stosu, jeśli was pop coś ze stosu jesteś skutecznie usuwając go.

To tylko powszechna wiedza w strukturach danych, faceci z rubinu właśnie przegapili dodając do niej znak !.

+0

Nie, nie ma takiej konwencji. (Cytowany Matsumoto w mojej odpowiedzi to projektant języka). – steenslag

+0

Spróbuj przeczytać cytowany tekst @steenslag, możesz znaleźć coś na pierwszej linii. –

2

„Druga konwencja jest taka, że ​​każda metoda, której nazwa kończy się wykrzyknikiem należy stosować z ostrożnością. (...) Często metody, które kończą się wykrzyknikiem są mutatory, które zmieniają stan wewnętrzny obiekt, ale nie zawsze tak jest, istnieje wiele mutacji, które nie kończą się wykrzyknikiem i liczbą nieututujących mutacji metod (takich jak Array.fill), które nie mają niezmutującego wariantu, zazwyczaj nie mają wykrzyknik (sic). "

(Ruby Programming Language, Flanagan & Matsumoto, strona 180)

Książka kontynuuje przykład exit kontra exit! (zarówno nonmutating;. exit! omijając wszystkie haki at_exit)

Powiązane problemy