2011-09-24 6 views
9

Zastanawiam się, dlaczego ludzie, którzy napisali bibliotekę File postanowili wprowadzić argumenty, które określają tryb otwierania pliku w ciągach zamiast symboli.Dlaczego nie są argumenty dla symboli File.new zamiast ciągów?

Na przykład, to jak to jest teraz:

f = File.new('file', 'rw') 

Ale czy nie byłoby lepiej konstrukcja zrobić

f = File.new('file', :rw) 

lub nawet

f = File.new(:file, :rw) 

na przykład ? To wydaje się być idealnym miejscem do ich użycia, ponieważ argument zdecydowanie nie musi być zmienny.

Chcę się dowiedzieć, dlaczego tak się stało.


Aktualizacja: Właśnie skończyłem czytać a related question about symbols vs. strings, i myślę, że konsensus był taki, że symbole nie są tak dobrze znane jak ciągi znaków, a każdy jest przyzwyczajony do używania łańcuchów do indeksowania tablic hashowych. Nie sądzę jednak, aby projektanci standardowej biblioteki Rubiego byli uprawnieni do niewiedzy na temat symboli, więc nie sądzę, że to jest powód.

+5

Jest to prawdopodobnie tylko historyczny artefakt, który powraca do "fopen" w bibliotece libc. –

+7

Czy sugerujesz, aby zdefiniować unikalny symbol dla każdej ważnej permutacji trybów 'File.new' (' r', 'w',' + ',' a', 'b',' t')? – Gabe

+0

Świetne pytanie. Istnieją stałe takie jak 'File :: RDWR' i' File :: CREAT', których możesz użyć, ale nie mogę znaleźć dokumentacji na jego temat. "Plik" [dokumentacja] (http://www.ruby-doc.org/core/classes/File.html) używa tych stałych, ale ich nie wyjaśnia. – rdvdijk

Odpowiedz

2

Nie jestem ekspertem w historii ruby, ale naprawdę masz trzy opcje, gdy chcesz parametrów do metody: ciągi, symbole i klasy statyczne.

Na przykład obsługa wyjątków. Każdy wyjątek jest typem wyjątku klasowego.

Dzięki temu każde pozwolenie na strumień może być jego własną klasą. Ale wymagałoby to wygenerowania jeszcze większej liczby klas dla systemu.

Rzecz w tym, że symbole nigdy nie są usuwane. Każdy wygenerowany przez ciebie symbol zachowuje się w nieskończoność; dlatego odradza się stosowanie metody ".to_sym". Prowadzi do wycieków pamięci.

Struny są po prostu łatwiejsze do manipulowania. Jeśli korzystasz z trybu wprowadzania od użytkownika, potrzebujesz ".to_sym" gdzieś w kodzie lub co najmniej dużej instrukcji switcha. Za pomocą łańcucha można po prostu przekazać dane wejściowe użytkownika bezpośrednio do metody (oczywiście jeśli ufasz takiemu).

Również w języku C przekazujesz znak do pliku metodą wejścia/wyjścia. W rubinach nie ma znaków, tylko struny. Widząc jak Ruby jest zbudowany na C, to może być to, skąd pochodzi.

1

To po prostu relikt z poprzednich języków.

+0

Nie zgadzam się. Czy możesz utworzyć kopię zapasową roszczenia za pomocą przykładów i wszelkich wypowiedzi twórców? –

+1

Nie będę sprawdzać dokumentów dla wszystkich starszych języków i pokażę, że wszyscy używają tego formatu, ale tutaj jest jeden przykład z innego języka internetowego: http://us3.php.net/manual/en/function .fopen.php – weexpectedTHIS

+0

OK, ale dlaczego PHP to zrobił?Czy to dlatego, że PHP jako język jest silnie oparty na łańcuchach? Czy to dlatego, że PHP nie obsługuje symboli takich jak Perl? Czy to dlatego, że ...? To, co robię, polega na tym, że nie dajesz żadnych dowodów, że jest to odpowiedź, a nie Twoja opinia. –

Powiązane problemy