2009-10-06 17 views
7

Recientemente he estado tratando de aprender los aspectos orientados a objetos de F # y me he vuelto curioso sobre cómo restringir el acceso a los tipos/módulos en el idioma.Archivos de firma y modificadores de acceso en F #

Más específicamente, quiero saber la diferencia entre escribir esto:

Example.fsi

module Stack = 
    val foo : string 

Example.fs

module Stack = 
    let foo = "foo" 
    let bar = "bar" 

y, alternativamente, esto:

module Stack = 
    let foo = "foo" 
    let private bar = "bar" 

¿No logran exactamente lo mismo al final? Viniendo de un fondo de C#, me inclino mucho a usar los modificadores de acceso sobre archivos de firma (FSI). Parecen ser más versátiles (pueden aplicarse a módulos/tipos en espacios de nombres, por ejemplo), mientras que no tengo ninguna situación en la que los archivos de firma ofrezcan algo que los modificadores de acceso no tienen.

+0

Su ejemplo no debería funcionar de todos modos ;-) (let foo _ = "bar") – Dario

+0

¿Por qué no debería funcionar? El ejemplo compila bien para mí. – Noldorin

+0

El .fsi declara foo como una función, pero luego el .fs lo define como un valor. – Brian

Respuesta

9

Logran casi lo mismo. (Tenga en cuenta que se puede utilizar un archivo .fsi para este tipo de espacios de nombres también, no estaba seguro de lo que su comentario sobre que significaba.)

Un archivo de firma tiene un par de ventajas:

  • Usted puede hacer que las entidades de public la duración del archivo, pero luego private a los archivos posteriores del proyecto.
  • Puede tener solo su breve resumen en el archivo de firma, por lo que la interfaz pública es fácil de leer sin tener que escanear toneladas de código.

No es necesario jugar con la primera viñeta: la encapsulación en el ensamblaje, como esta, es en realidad una gran característica para proyectos de gran envergadura. Ser capaz de definir unos pocos tipos que son públicos entre sí dentro de File1.fs, pero que luego tienen un subconjunto de esos tipos/métodos para ser públicos para el resto (File2.fs, File3.fs, etc.) es bastante útil (un poco como 'amigo' en C++).

+1

@Brian: Gracias por la respuesta. Me refería a la parte inferior de esta página - http://en.wikibooks.org/wiki/F_Sharp_Programming/Modules_and_Namespaces - no se pueden usar los FSI en los espacios de nombres. ¿Podrías aclarar a qué te refieres con "la continuación" del proyecto? – Noldorin

+1

Veo, ese documento está mal; @Juliet, si estás leyendo esto, ¿lo actualizarías? Tenga en cuenta que puede usar fsc --sig en un archivo .fs que contenga espacios de nombres para ver la sintaxis del código .fsi para espacios de nombres. – Brian

+1

@Brian: Ah, es suficiente entonces. Pequeño comando útil, eso es. Gracias por la aclaración, también. – Noldorin

Cuestiones relacionadas