2011-09-24 14 views
9

Me preguntaba por qué las personas que escribieron la biblioteca File decidieron hacer los argumentos que determinan qué modo se abre el archivo en cadenas en lugar de símbolos.¿Por qué no son los argumentos para File.new símbolos en lugar de cadenas?

Por ejemplo, esta es la forma en que es ahora:

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

Pero ¿no sería un diseño mejor que hacer

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

o incluso

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

por ejemplo, ? Este parece ser el lugar perfecto para usarlos ya que definitivamente el argumento no necesita ser mutable.

Estoy interesado en saber por qué salió de esta manera.


Actualización: Acabo de terminar de leer a related question about symbols vs. strings, y creo que el consenso fue que los símbolos simplemente no son tan conocidos como cadenas, y todos están acostumbrados a usar cadenas para indexar tablas hash de todos modos. Sin embargo, no creo que sea válido para los diseñadores de la biblioteca estándar de Ruby alegar ignorancia sobre el tema de los símbolos, así que no creo que esa sea la razón.

+5

Esto es probablemente solo un artefacto histórico que se remonta a 'fopen' en libc. –

+7

¿Está sugiriendo que se defina un símbolo único para cada permutación válida de los modos 'File.new' (' r', 'w',' + ',' a', 'b',' t')? – Gabe

+0

Gran pregunta. Hay constantes como 'File :: RDWR' y' File :: CREAT' que puedes usar, pero no puedo encontrar documentación al respecto. El 'Archivo' [documentación] (http://www.ruby-doc.org/core/classes/File.html) usa estas constantes, pero no las explica. – rdvdijk

Respuesta

2

No soy un experto en la historia de ruby, pero realmente tiene tres opciones cuando quiere parámetros para un método: cadenas, símbolos y clases estáticas.

Por ejemplo, manejo de excepciones. Cada excepción es en realidad un tipo de clase Excepción.

ArgumentError.is_a? Class 
=> True 

Así que podría tener cada permiso para la transmisión ya sea de su propia clase. Pero eso requeriría que se generaran aún más clases para el sistema.

Lo que pasa con los símbolos es que nunca se eliminan. Cada símbolo que generas se conserva indefinidamente; es por eso que se desaconseja usar el método '.to_sym'. Esto conduce a pérdidas de memoria.

Las cadenas son simplemente más fáciles de manipular. Si obtuvo el modo de entrada del usuario, necesitaría un '.to_sym' en algún lugar de su código, o al menos, una gran declaración de cambio. Con una cadena, puede pasar la entrada del usuario directamente al método (si usted confiaba tanto, por supuesto).

Además, en C, le pasa un carácter al archivo de método de E/S. No hay Chars en ruby, solo cuerdas. Viendo cómo el rubí se basa en C, podría ser de donde viene.

1

Es simplemente una reliquia de idiomas anteriores.

+0

No estoy de acuerdo. ¿Podría hacer una copia de seguridad de su reclamo con ejemplos y declaraciones de los creadores? –

+1

No voy a buscar los documentos en todos los idiomas antiguos y mostrarles que todos usan este formato de cadena, pero he aquí un ejemplo de otro idioma web: http://us3.php.net/manual/en/function .fopen.php – weexpectedTHIS

+0

Ok, pero ¿por qué PHP lo hizo?¿Es porque PHP como un lenguaje se basa principalmente en cadenas? ¿Es porque PHP no admite símbolos como Perl? ¿Es porque ...? Lo que estoy consiguiendo es que no proporcione evidencia de que esta sea una respuesta en lugar de su opinión. –

Cuestiones relacionadas