2011-09-24 6 views
9

Mi chiedevo perché le persone che hanno scritto la libreria File hanno deciso di creare gli argomenti che determinano in quale modalità il file viene aperto nelle stringhe anziché nei simboli.Perché gli argomenti non sono File.new invece di stringhe?

Per esempio, questo è come è ora:

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

Ma non sarebbe un progetto di meglio da fare

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

o anche

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

per esempio ? Questo sembra essere il posto perfetto per usarli dato che la discussione non ha bisogno di essere mutabile.

Sono interessato a sapere perché è venuto in questo modo.


Aggiornamento: ho appena finito di leggere a related question about symbols vs. strings, e penso che il consenso fosse che i simboli non sono altrettanto noti come stringhe, e tutti sono abituati a usare le stringhe per indicizzare le tabelle di hash in ogni caso. Tuttavia, non penso che sarebbe valido per i progettisti della libreria standard di Ruby far valere l'ignoranza sul tema dei simboli, quindi non credo che sia la ragione.

+5

Questo è probabilmente solo un artefatto storico che riporta a 'fopen' in libc. –

+7

Stai suggerendo di definire un simbolo univoco per ogni permutazione valida delle modalità 'File.new' (' r', 'w',' + ',' a', 'b',' t')? – Gabe

+0

Ottima domanda. Ci sono costanti come 'File :: RDWR' e' File :: CREAT' che puoi usare, ma non riesco a trovare la documentazione su di esso. La 'File' [documentazione] (http://www.ruby-doc.org/core/classes/File.html) usa queste costanti, ma non le spiega. – rdvdijk

risposta

2

Non sono esperto nella cronologia di Ruby, ma in realtà si hanno tre opzioni quando si vogliono i parametri di un metodo: stringhe, simboli e classi statiche.

Ad esempio, gestione delle eccezioni. Ogni eccezione è in realtà un tipo di eccezione di classe.

ArgumentError.is_a? Class 
=> True 

Così si potrebbe avere ogni autorizzazione per il flusso sia la propria classe. Ma ciò richiederebbe ancora più classi da generare per il sistema.

La cosa sui simboli è che non vengono mai cancellati. Ogni simbolo che generi è conservato indefinitamente; è per questo che usare il metodo '.to_sym' alla leggera è scoraggiato. Porta a perdite di memoria.

Le stringhe sono solo più facili da manipolare. Se hai ottenuto la modalità di input da parte dell'utente, avresti bisogno di un '.to_sym' da qualche parte nel tuo codice, o almeno di una grande istruzione switch. Con una stringa, puoi semplicemente passare l'input dell'utente direttamente al metodo (se fossi così fiducioso, ovviamente).

Inoltre, in C, si passa un carattere al metodo i/o del file. Non ci sono Char in ruby, solo archi. Visto come il rubino è costruito su C, potrebbe essere da dove viene.

1

È semplicemente una reliquia dalle lingue precedenti.

+0

Non sono d'accordo. Potresti eseguire il backup delle tue affermazioni con esempi e dichiarazioni dei creatori? –

+1

Non ho intenzione di cercare i documenti per tutte le lingue più vecchie e mostrare che tutti usano questo formato di stringa, ma qui c'è un esempio da un altro linguaggio web: http://us3.php.net/manual/en/function .fopen.php – weexpectedTHIS

+0

Ok ma perché PHP lo ha fatto?È perché il PHP come linguaggio è basato pesantemente sulle stringhe? È perché PHP non supporta simboli come Perl? È perché ...? Quello che sto succedendo è che non fornisci prove che questa sia una risposta piuttosto che la tua opinione. –